处理 pybind11 中的不透明指针



我正在将一个用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 的等效代码。作为参考,这里有一个我想使用 Pybind11 向 Python 公开的 C 标头:

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>());
}

如果您的目标是简单地允许将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

最新更新