Python Wiki のboost.python/HowToには、C++ オブジェクトを内部のモジュール属性として公開する例がありますBOOST_PYTHON_MODULE
。
namespace bp = boost::python;
BOOST_PYTHON_MODULE(example)
{
bp::scope().attr("my_attr") = bp::object(bp::ptr(&my_cpp_object));
}
BOOST_PYTHON_MODULE
使用外の属性を設定するには
bp::import("example").attr("my_attr") = bp::object(bp::ptr(&my_cpp_object));
これで、Pythonで次のようなことができます
from example import my_attr
もちろん、my_cpp_object
事前に のクラスを登録し (たとえば、同じ呼び出し内でこれを行うことができますBOOST_PYTHON_MODULE
)、C++ オブジェクトの寿命が python モジュールの寿命を超えていることを確認する必要があります。bp::object
C++ をラップする代わりにany を使用できます。
は例外を飲み込むことに注意してください。そのBOOST_PYTHON_MODULE
ため、間違いを犯した場合、エラー表示は表示されず、BOOST_PYTHON_MODULE
生成された関数はすぐに戻ります。このケースのデバッグを容易にするために、内部で例外をキャッチBOOST_PYTHON_MODULE
するか、一時的にログ ステートメントを最後の行として追加して、BOOST_PYTHON_MODULE
到達したことを確認できます。
BOOST_PYTHON_MODULE(example)
{
bp::scope().attr("my_attr2") = new int(1); // this will compile
std::cout << "init finished\n"; // OOPS, this line will not be reached
}