#c #boost-python
#c #boost-python
Вопрос:
Это может быть тривиальным, но я как бы застрял здесь.
У меня следующая настройка:
entity.cpp/.hpp
: содержит определение и реализацию моего класса сущностей.entity_wrap.cpp
: мой файл-оболочка boost python, который я компилирую вentity.so
entity_test.cpp
: тестовый файл
Что я хотел бы сделать entity_test.cpp
, так это следующее:
Py_SetProgramName(argv[0]);
Py_Initialize();
...
Entity* entity = new Entity;
globals["entity"] = entity;
Теперь я получаю следующее исключение:
TypeError: No to_python (by-value) converter found for C type: Entity
Что очевидно, поскольку я не загружаю определение преобразования моих типов. Теперь я попытался загрузить entity.so
с globals["entity_module"] = import("entity");
помощью, но столкнулся с этим исключением:
ImportError: No module named entity
Я могу загрузить модуль из оболочки python, как и ожидалось.
Теперь мой вопрос: как мне загрузить преобразователи, определенные в entity_wrap.cpp
?
Решение
Как заявил eudoxos, я должен убедиться, что модуль, который я хочу загрузить, находится в sys.path
:
globals["sys"] = import("sys");
exec("sys.path.append('/path/to/my/module')n"
"import entity", globals);
Теперь это работает как шарм. Очевидно, просто использовать Py_SetProgramName(argv[0]);
было недостаточно.
Ответ №1:
С boost::python::import
помощью; следите за sys.path
тем, чтобы ваш модуль был найден, возможно, вам захочется добавить вызов
PyRun_SimpleString("import sys; sys.path.append('.');")
Первый. Ну, тогда вы также можете выполнить импорт через PyRun_SimpleString
🙂
Другой вариант: написать entity_test
сам на python.
Комментарии:
1. eudoxos: Большое спасибо, я получил аналогичное решение примерно в то же время. Я соответствующим образом обновлю свой вопрос.