PythonコードのC++ 埋め込み(Linux)
おためし(参考: http://docs.id774.net/docs/python/2.6.2-ja/extending/embedding.html)。
以下、testPythonEmbedding1.cpp。
#include#include int main(void) { Py_Initialize(); PyRun_SimpleString("print 'hello python'"); Py_Finalize(); return 0; }
このとき、Python.hはほかのライブラリよりも先にincludeしないとだめらしい。なぜかというと、システムによっては標準ヘッダの定義に影響するようなプリプロセッサ定義をしているとかなんとか(https://docs.python.jp/3/c-api/intro.html)。
$ g++ testPythonEbedding1.cpp g++ testEmbedPythonCpp.cpp $(pkg-config --cflags --libs python) -o hoge.out
Python.hがないというエラーが出る場合、sudo apt-get install python2.7-dev とかでインストール。
python-config と pkg-config で出力が違うのはなぜなんだぜ? python-configのオプションをg++に食わせたら、gcc用のオプションを含んでいてエラー出た・・・。なお、Python2系列と3系列で埋め込み方法に違いがあるようだ。で、この高水準な埋め込みからだんだんと低水準な埋め込みに下っていくと、C++コーディングでのPython利用方法が広がっていくというかそんな感じ。
コンパイル方法、Windows環境に関しても調べなきゃならないの、本当にめんどい。
なんかこんな記事もあった:http://d.hatena.ne.jp/rinnSanada/20110412/1302609154
公式ドキュメント2つ目の例を参考に、自作したモジュールを読み込んで実行テストしようとしたところ、
ImportError: No module named pyfunction
と怒られてしまったが、これはパスの設定のせいらしい。ここ(https://stackoverflow.com/questions)の真似をしてパスにカレントディレクトリを追加したところ、モジュールが読み込めた。要は、自作モジュールを置くディレクトリを決めておけという話か・・・? とりあえずテストしたかっただけだから、今のことろは、
$ PYTHONPATH=. hoge.out testModule FunctionInModule
とすればインポートできる。これは一時的な措置なので、cppソースコード中でパスを追加する記述をした方がよさげ。この辺に似たような対応した旨かいてあった(https://www.daniweb.com/programming/software-development/threads/301161/python-pure-embedding-with-c-importerror)。
公式ドキュメントの2つ目の例は、引数にPythonモジュール・関数名・関数の引数をC++の実行ファイルの引数にとり、任意のPythonで書かれた関数を実行しているようだったが、今回は使いたい関数はもう決まっているので、C++ソースコードに全部直書きすればよいはず。この辺は自分で書かないとダメそう・・・。
参考
- https://docs.python.jp/2.7/c-api/intro.html
- https://docs.python.org/2/c-api/object.html
- http://www.linuxjournal.com/node/8497/print
- http://d.hatena.ne.jp/rinnSanada/20110412/1302609154
- http://docs.python.jp/2/extending/embedding.html
- https://docs.python.org/2/extending/embedding.html
- https://www.daniweb.com/programming/software-development/threads/301161/python-pure-embedding-with-c-importerror
- http://d.hatena.ne.jp/mole-studio/20120702/1341211752
- https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14116360844
- http://d.hatena.ne.jp/rinnSanada/20110412/1302609154
- https://docs.python.jp/2.7/c-api/intro.html
- https://docs.python.org/2/c-api/object.html
- https://docs.python.jp/2.7/c-api/tuple.html
- http://docs.python.jp/2/c-api/int.html
- https://www.hardcoded.net/articles/embedding-python-in-objc %(オブジェクトのメンバ関数をコールする方法ここに)
- https://docs.scipy.org/doc/numpy/reference/c-api.array.html %(PyObjectがnumpyを格納している場合はnumpyのAPIをたたく?)
- http://d.hatena.ne.jp/chrofieyue/20120516/1337137034 (PyArrayObjet とか)
- http://www.python-izm.com/contents/numerical/numpy/ndarray_tolist.shtml %(Numpy.ndarrayをlistに変換すればPyObjectから要素を取り出せる・・・)