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++ソースコードに全部直書きすればよいはず。この辺は自分で書かないとダメそう・・・。


参考

Python C++ API リファレンス