擅长:python、mysql、java
Python Wiki上的P>^ {A1}有一个例子,它将C++对象暴露为^ {CD1>}:/P>
<pre><code>namespace bp = boost::python;
BOOST_PYTHON_MODULE(example)
{
bp::scope().attr("my_attr") = bp::object(bp::ptr(&my_cpp_object));
}
</code></pre>
<p>要在<code>BOOST_PYTHON_MODULE</code>之外设置属性,请使用</p>
^{pr2}$
<p>现在您可以在python中执行以下操作</p>
<pre><code>from example import my_attr
</code></pre>
当然,你需要预先登记^ {CD3>}类(例如,你可以在同一个^ { CD1>}调用中这样做),并确保C++对象的生命周期超过Python模块的生命周期。可以使用任何^ {< CD5> }而不是包装C++一个。在</p>
<p>注意,<code>BOOST_PYTHON_MODULE</code>吞并异常,因此如果您出错,您不会收到任何错误指示,<code>BOOST_PYTHON_MODULE</code>生成的函数将立即返回。为了简化此案例的调试,您可以在<code>BOOST_PYTHON_MODULE</code>内捕获异常,或者临时添加一些日志记录语句作为<code>BOOST_PYTHON_MODULE</code>的最后一行,以查看是否已到达:</p>
<pre><code>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
}
</code></pre>