Предоставление C++ единоличного владения объектом класса в pybind11Python

Программы на Python
Ответить
Anonymous
 Предоставление C++ единоличного владения объектом класса в pybind11

Сообщение Anonymous »

У меня есть приложение, в котором я хочу предоставить класс C++ MyClass для Python с помощью pybind. Поскольку я хочу, чтобы Python был встроен в C++, я использую PYBIND11_EMBEDDED_MODULE, чтобы предоставить свой класс C++.

Код: Выделить всё

class MyClass
{
void method1();
void method2();
}

PYBIND11_EMBEDDED_MODULE(myModule, m)
{
py::class_(m, "MyPyClass")
.def(py::init())
.def("method1()", &MyClass::method1)
.def("method2()", &MyClass::method2)
}
Теперь я хочу, чтобы он работал таким образом, чтобы я брал уже созданный экземпляр MyClass, скажем, myInstance - и создавал экземпляр Python из этот. Для этого я использую py::cast()

Код: Выделить всё

void doPython(MyClass* myInstance)
{
py::module_ myModule = py::module_::import("myModule");

py::object myPyInstance = py::cast(myInstance);

... // work with myPyInstance further
}
Теперь проблема, которую я пытаюсь решить: Я хочу, чтобы мое приложение C++ единолично владело myInstance. Я хочу, чтобы myPyInstance не имел ничего общего со временем существования myInstance. И что если myInstance в какой-то момент будет уничтожен, myPyInstance должен знать об этом и обработать этот случай.
Есть ли какой-то слабый рабочий процесс с ссылками, который я могу использовать? pybind изначально допускает рабочий процесс unique_ptr илиshared_ptr, но ни один из них не работает в моем случае.
Рабочий процесс настраиваемого интеллектуального указателя звучит многообещающе, и я нашел решение, в котором интеллектуальный указатель удерживал держатель мойЭкземпляр. Я надеялся, что .get() интеллектуального указателя будет вызываться при вызове отдельных методов, позволяя интеллектуальному указателю проверять, активен ли myInstance или нет. Но похоже, что .get() вызывается при вызове cast() и результат сохраняется.
Существует return_value_policy::reference, но он не обрабатывает случай, когда объект удаляется приложением C++, хотя на него все еще ссылается Python, и это критический случай для меня.
Возможно, py:: капсула? но это оказывается слишком многословно

Подробнее здесь: https://stackoverflow.com/questions/792 ... n-pybind11
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»