处理pybind11中的不透明指针

时间:2018-06-01 10:31:31

标签: python c++ boost pybind11 opaque-pointers

我正在将用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>());
}

1 个答案:

答案 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