Я попытался написать простую встроенную программу на 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 ответ
Вам необходимо инициализировать свой тестовый модуль. Просто заявить, что это не работает.
Лучший способ сделать это - добавить функцию init к вкладке init с помощью PyImport_AppendInittab
.
PyImport_AppendInittab("test", PyInit_test);
Это должно вызываться перед Py_Initialize()
.
Теперь test
доступен для импорта, как и любой другой модуль Python. Вы можете сделать это из кода Python или из C ++:
PyImport_ImportModule("test");
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.