2017-06-19 5 views
2

私は今週一週間、pypyソースツリーを手直しして、次の質問を思いつきました。rpythonプログラムをいくつかの機能を公開する共有オブジェクトとして構築する方法はありますか?つまり、標準のcpython vmの関数リスト(関数のリストなど)です。つまり、この関数を共有オブジェクトのインポートを介してPythonスクリプトから呼び出すことができます。 私はそうのように私のプログラムを構築しよう:実際には、しかし、CPythonのからunimportable生成されますlibmyprogram-c.so標準のPythonコードからrpythonベースの関数を呼び出す

python rpython --shared -O2 some_program.py 

。次にcpythonにCFFIを使うべきでしょうか、それともrpythonフレームワークに何らかの機能(デコレータや何か)があり、それをうまくカットする必要がありますか?

答えて

4

本当に便利な方法はありません。 RPythonプログラムを書いてlibmyprogram-c.soに入り、CPythonからそのCライブラリにアクセスしてください。 cffiで。

具体的には、デコレータrpython.rlib.entrypoint.entrypoint_highlevel()を使用して、.soが選択したC APIをエクスポートするようなRPythonソースコードを記述します。しかし、Cのレベルで動作するCライブラリを手に入れることができます。Pythonオブジェクトを渡すのに役立つものは何もありません.Cタイプしかありません。 "list"や "dict"のようなデータ構造の概念はなく、境界を越えた自動ライフタイム管理はありません。

また、libmyprogram-c.soとなるRPythonソースコードをデバッグすることは、通常のCライブラリをデバッグすることよりも難しくなります。 RPythonのプログラムやライブラリは、少なくともPython上でテストするときにデバッグできるので、Cに翻訳しようとする前に完全にテストすることをお勧めします。

RPythonはガベージコレクタを使用し、高い割り当て率に調整されたときにのみ輝きます---最も重要なのは---ジャストインタイムコンパイラジェネレータで、RPythonプログラムからJITコンパイラを生成する場合です後者は何らかの動的なインタプリタです。あなたがこれを使用していない場合、RPythonは不適当です。しかし、それは別の話です:-)

関連する問題