Boost.Python を使って、Python から C/C++ の関数を呼び出しを、OSX でトライしたときの記録です。Python3 前提です。
OSX で Boost.Python を使う方法がうまく見つけられなかったので、記録として残しておきます。どれくらい需要があるかはナゾですが、、
情報はすべて 2020/07 現在のものです。(Python3.8)
手順
1. Boost.Python のインストール
Python3 版は boost-python3
という Formula になります。
brew install boost-python3
2. C/C++ コードのコンパイル
例えば、C++ ライブラリとして以下のようなコードを用意します。
my_sample.cpp
#include <string>
#include <boost/python.hpp>
using namespace std;
string add_hello( const string s )
{
return "Hello, " + s;
}
// モジュールの初期化ルーチン:モジュール名=my_sample
BOOST_PYTHON_MODULE( my_sample )
{
// C++のadd_hello関数を、greetという名前でpython用に公開
boost::python::def( "greet", add_hello );
}
コンパイルのためのコマンドは下記になります。
g++ -shared -fPIC -I/usr/local/include -L/usr/local/lib \
$(python3-config --includes --ldflags --embed) -lboost_python38 \
my_sample.cpp -o my_sample.so
これで、Python からは my_sample.so
を import my_sample
として呼び出すことができるようになります。
3. Python からの呼び出し
import my_sample
print(my_sample.greet("hoge")) # "Hello, hoge"
補足
私がトライしたときは、コンパイラは brew で入る g++-10
ではうまく行かず、XCode 付属の g++
でうまくいきました。C++ 標準が違う、みたいな警告が出てたので、boost_phthon38
が g++
でコンパイルされているから、ということでしょうか。
参考資料
-
boost-python3
Formula のテストコード。ここの処理内容をみてようやく、OSX でのコンパイル方法がわかりました。