Как правильно инициализировать и завершить интерпретатор python в классе C ++ в Pybind11? - PullRequest
0 голосов
/ 30 марта 2020

Я пишу класс 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 невозможно.

...