2008年10月2日木曜日

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]

<< ホーム