При встраивании python в C++ через PyBind11 я застрял на следующей проблеме. Представьте, что я создаю экземпляр объекта shared_ptr через C++, а затем хочу передать этот указатель в pybind11, чтобы сгенерировать для него «теневую» привязку Python.
Вот моя первоначальная нерабочая попытка:
#include <stdio.h>
#include <pybind11/pybind11.h>
#include <pybind11/embed.h>
using namespace std;
namespace py = pybind11;
class Pet
{
public:
Pet() {}
void bark(void) { printf("wow!\n"); }
};
PYBIND11_PLUGIN(Pets) {
py::module m("Pets", "Say hello to our pets");
py::class_<Pet, shared_ptr<Pet>>(m, "Pet")
.def("bark", &Pet::bark)
;
return m.ptr();
}
int main(int argc, char *argv[])
{
py::scoped_interpreter guard{};
shared_ptr<Pet> pet = make_shared<Pet>();
// How do Ι "assign" Pet.pet to the C++ pet? This compiles,
// but throws a run time exception:
py::globals()["pet"] = py::cast(pet);
py::exec("pet.bark()\n");
}
Итак, мои вопросы:
- Итак, как я могу создать «теневой класс» для C++ shared_ptr?
- Как я могу «назначить» C++ shared_ptr переменной python?