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 模块的生命周期。您可以使用 anybp::object
而不是包装 C++ 之一。
请注意,它会BOOST_PYTHON_MODULE
吞下异常,因此如果您犯了错误,您不会收到任何错误指示,并且BOOST_PYTHON_MODULE
-generated 函数将立即返回。为了简化这种情况的调试,您可以在内部捕获异常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
}