Работа с непрозрачными указателями в pybind11 - PullRequest
0 голосов
/ 01 июня 2018

Я перемещаю модуль Python, написанный на C ++, из 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, который я хочу представить в Python, используя Pybind11:

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 голосов
/ 05 мая 2019

Если ваша цель состоит в том, чтобы просто разрешить передачу указателей объекта 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...