Если вы проверите получившийся объект py :: из приведения (например, приведя его к bool), вы увидите, что вызов не удался. Причина в том, что питон не знает класс «Pet» (ни shared_ptr). Вы можете использовать код, описанный выше, и создать из него модуль обычным способом, а затем импортировать его в основную программу. Или используйте функцию EMBEDDED_MODULE, которая ближе к тому, к чему вы стремитесь.
Настройка вашего примера:
#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_EMBEDDED_MODULE(Pets, m) {
py::class_<Pet, shared_ptr<Pet>>(m, "Pet")
.def("bark", &Pet::bark)
;
}
int main(int argc, char *argv[])
{
py::scoped_interpreter guard{};
shared_ptr<Pet> pet = make_shared<Pet>();
auto pets_mod = py::module::import("Pets");
py::globals()["pet"] = py::cast(pet);
py::exec("pet.bark()\n");
}