Я пишу класс C ++, который взаимодействует с модулем Python и предоставляет некоторые функции клиентам C ++. Я считаю, что способ инициализации и финализации интерпретатора в pybind11 неправильный, и я ищу правильный способ сделать это.
Вот что я сделал:
class MyCPPClass
{
public:
MyCPPClass(arg1, arg2,...)
{
py::initialize_interpreter();
// the rest of the code such as initializing different py::objects etc
this->module = py::module::import("F.MyModule");
this->cls = this->module.attr("MyPyClass");
//...
this->obj = this->cls(**kwargs);
this->start_fn = this->obj.attr("start");
}
int Exposed_Func1(arg1, arg2, ...)
{
return this->start_fn(arg1,arg2, ...);
}
void Exposed_Func2(arg1, arg2, ...)
{
//...
}
~MyCPPClass()
{
py::finalize_interpreter();
}
private:
py::object module;
py::object cls;
py::object obj;
py::object start_fn;
};
Я ищу способ сделать все самодостаточным в самом классе. то есть я не хочу делать что-то подобное в клиентском коде:
py::scoped_interpreter guard{};
MyCPPClass obj;
// use obj!
Поскольку я хочу, чтобы все это было прозрачным для клиентов, и они имеют дело только со стандартными типами C ++. Какие у меня варианты на этот счет?
Обновления
Я заметил, что если я добавлю py::scoped_interpreter guard{};
в качестве первого поля в классе, ошибка исчезнет, и cra sh не произойдет. все хорошо.
Однако как мне ответить на этот комментарий?
Использование py :: scoped_interpreter в качестве поля совершенно неверно. Переводчик-одиночка. Создание нескольких копий scoped_interpreter невозможно.