boost::python、embedding(埋め込み)
あまりにも本家のドキュメントが少なく、また日本語で検索してもほとんどひっかかりません。
また、真面目にやろうとするとboost::pythonとPythonについて熟知しなくてはならないようで、
これは意外と手間のかかる作業かもしれません。
一般にboost::pythonは『PythonからC++のコードを呼び出す』という文脈で使われることが多いようですが、
その逆、『C++からPythonを呼び出す』ことも当然サポートしています。
一番簡単な例、要するにC++からPythonで書かれた関数を呼び出して値を返してもらう、
ということのやり方は本家のドキュメントにあるので(それしかないとも言う)、ここでは書きません。
しかし埋め込みを実用的なものにするには、もっと多くの機能が必要で、
それらはboost::python上で実装されているにも関わらずほとんどドキュメントが(英語ですら)ありません。
やりたいことその1は、C++から呼び出したPython上のコードで、
C++で書かれたクラスやenumを使いたい、というような場合です。
embeddingでなければ、これはBOOST_PYTHON_MODULEを使えば難なくできることなのですが、
embeddingでのやり方は今のところドキュメントに記述されていません。
結論から言えば、非embedding時の方法にもう二手間加えることで、
embedding時もこれは容易に可能になります。
手間一つ目は、BOOST_PYTHON_STATIC_LIBを#defineすること。
手間二つ目は、Py_Initialize()する前に、PyImport_AppendInittabでモジュールを登録することです。
後者は少しだけ追加説明が必要でしょうか。
BOOST_PYTHON_MODULE(name)は、init##name()という関数を定義しています。
これをPyImport_AppendInittab関数に渡してやることにより、
はじめてPythonスクリプト内でimportできるようになります。
int PyImport_AppendInittab( char *name, void (*initfunc)(void))
その2に続く?
0 件のコメント:
コメントを投稿
登録 コメントの投稿 [Atom]
<< ホーム