我正在将用C ++编写的Python模块从Boost.Python转移到Pybind11。我的C ++代码依赖于具有不透明指针的C库。使用Boost.Python,我使用这里的文档来处理这些不透明的指针:https://www.boost.org/doc/libs/1_66_0/libs/python/doc/html/reference/to_from_python_type_conversion/boost_python_opaque_pointer_conv.html
我找不到Pybind11的等效代码。作为参考,这里是一个C头,我想使用Pybind11公开给Python:
typedef struct mytruct* mystruct_t;
void myfunction1(mystruct_t x);
mystruct_t myfunction2();
这可以通过Boost.Python公开,如下所示:
BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(mystruct)
namespace bpl = boost::python;
BOOST_PYTHON_MODULE(mymodule) {
bpl::opaque<mystruct>();
bpl::def("f1", &myfunction1);
bpl::def("f2", &myfunction2, bpl::return_value_policy<bpl::return_opaque_pointer>());
}
答案 0 :(得分:0)
如果您的目标是仅允许在不公开信息的情况下将C ++对象的指针传递给Python,那么您应该只能够注册该类:
PYBIND_MODULE(mymodule, m) {
py::class_<mystruct>(m, "mystruct");
m.def("f1", &myfunction1);
m.def("f2", &myfunction2);
}
如果您希望避免与可能声明此第三方类型的其他pybind11
模块冲突,请考虑使用py::module_local()
:
https://pybind11.readthedocs.io/en/stable/advanced/classes.html#module-local-class-bindings