Я попытался написать простую встроенную программу на Python, следуя найденным мною руководствам и примерам. Он должен просто создать класс на C ++, передать его функции python, которая вызывает ее единственный метод:

class TestClass
{
public:
    void f() { std::cout << "Hello world!" << std::endl; }
};

typedef boost::shared_ptr<TestClass> tc_ptr;

BOOST_PYTHON_MODULE(test)
{
   boost::python::class_<TestClass>("TestClass")
       .def("f", &TestClass::f);
}

int main()
{
    Py_Initialize();
    PyRun_SimpleString(
        "def g(tc):\n"
        "    tc.f()\n");
    tc_ptr test_class(new TestClass);
    boost::python::object p_main = boost::python::object(
                                       boost::python::handle<>(
                                           boost::python::borrowed(PyImport_AddModule("__main__"))));
    boost::python::object func = p_main.attr("g");
    func(boost::python::ptr(p.get()));

    Py_Finalize();
    return 0;
}

Запустив его, я получаю следующее сообщение об ошибке: «TypeError: для класса C ++ TestClass не зарегистрирован класс Python». Я нашел вопрос о передаче объектов C ++ в функции python, даже попытался запустить тот же код из решения, но все же получил ту же ошибку.

Есть идеи, что мне не хватает?

-1
Bence Nagy 30 Сен 2020 в 22:42

1 ответ

Лучший ответ

Вам необходимо инициализировать свой тестовый модуль. Просто заявить, что это не работает.

Лучший способ сделать это - добавить функцию init к вкладке init с помощью PyImport_AppendInittab.

PyImport_AppendInittab("test", PyInit_test);

Это должно вызываться перед Py_Initialize().

Теперь test доступен для импорта, как и любой другой модуль Python. Вы можете сделать это из кода Python или из C ++:

PyImport_ImportModule("test");
0
n. 'pronouns' m. 1 Окт 2020 в 12:37