Boost :: Python: встраивать и загружать Boost :: Модули и конвертеры Python

#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: Большое спасибо, я получил аналогичное решение примерно в то же время. Я соответствующим образом обновлю свой вопрос.