C++でPython開発したい
構造がシンプルそうなpybind11を利用してやってみる。
pybind11 はサブモジュールとして設定されているので、
git clone したら
git submodule update --init --recursive
する。
ビルドする時は、cmakeのコマンドを実行するのではなく、Pythonのsetup.py側にcmakeコマンドが
書かれているので、
pip install ### で、ビルドができるようになっている。
setup.py の内容のメモ。
CMakeExtension の継承もとのExtensionは、C++拡張モジュールを表す。setupの ext_modules で、ビルドする拡張モジュールを指定。
cmdclass で、コマンド名からCmommandサブクラスへのマッピング。
このマッピングされているクラス内で、
cmakeのコマンドを作り、subprocessで実行している。
マッピングしている build_ext は、パッケージ中の拡張を構築する。
他には build_clib( パッケージ中のCライブラリを構築) build_py パtぅケージ中の .py .pycファイルを構築
というのがある。
マッピング用の dict の key がこのいずれか、実際にマッピングされた動作本体が、dictのvalueとして指定されたクラス。
マッピングコマンドはこれ以下。
setup.py 側の書き方参考。
setup.pyの公式Help
準備する必要があるのは
setup.py CMakeLists.txt pybind11をサブモジュール化。
C++側の関数を呼び出すには
PYBIND11_MODULE を使う。
m.def(名前、呼び出す関数、docs);
で登録。
PythonでImportしたときに
dynamic module does not define module export function pybind11
でエラーになる。
これは
PYBIND11_MODULE(cmake_example, m)
{
}
ここで指定する モジュール名と、CMakeLists.txtやsetup.py で指定するモジュール名が
一致していないとだめだった。
個々の名前は
CMakeLists.txtの
add_subdirectory(pybind11)
pybind11_add_module(cmake_example src/main.cpp)
ここ。
setup.cfgについて
setup.py の setup() の中身を別ファイルに分離できる。