Как правильно включить встроенный модуль pybind11 в пользовательский класс (как часть одноэлементного класса) - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть динамическая библиотека Linux C ++, которая требуется для передачи составной структуры в python и получения структуры результатов от python для передачи в приложение вызывающего.

Чтобы получить интерпретатор python "живым"после того, как функция API библиотеки возвращается обратно в приложение вызывающего, я решил использовать синглтон-класс (используя getInstance ...)

Для API C / Python (я пытаюсь ...) использовать механизм встроенного модуля pybind11

Вопрос в том, как подключить встроенный модуль к одноэлементному классу, просто имея в виду, как вызывать его оттуда (также с переданными аргументами)?-in-class-method-using-pybind11 ", но он не отвечает на мой вопрос

1 Ответ

0 голосов
/ 19 февраля 2019

Кажется, я нашел ответ

Хотя я работаю над проектом Linux, я нахожу эту ссылку: Встраивание Python в проект C ++ с Visual Studio , с его примером проекта,очень образовательный,

и оглядываясь на встроенную документацию pybind11 , раздел 13.4 в PDF, показывает, что это просто сделать так:

Включить "py :: module"член класса C ++, который будет инициализирован с помощью py :: module :: import ("имя_модуля");

, а затем вызовет C'tor и т. д., используя его

, например:

// class member
py::module mModule;

и

//initialization
mModule = py::module::import("module_name");
mModule .attr("initialize").call(mArg1, mArg2);

Поскольку это одноэлементный класс в библиотеке, а не обычный пример main (), для времени жизни интерпретатора, я считаю, что лучше использовать:

py::initialize_interpreter();
{
//call py code...    
}

и затем вызовите py::finalize_interpreter(); при уничтожении этого экземпляра

вместо обычного py::scoped_interpreter guard{};, который заканчивает свой срок службы в конце области действия

...