Boost :: Python: вставлять и загружать модули и конвертеры Boost :: Python - PullRequest
1 голос
/ 02 ноября 2011

Это может быть тривиально, но я застрял здесь.

У меня есть следующие настройки:

  • entity.cpp/.hpp: содержит определение и реализацию моего класса Entity.
  • entity_wrap.cpp: мой файл-обертка для 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 Ответ

1 голос
/ 02 ноября 2011

С boost::python::import;следите за sys.path, хотя, чтобы ваш модуль был найден, вы можете сначала добавить вызов

PyRun_SimpleString("import sys; sys.path.append('.');")

.Ну, вы можете выполнить импорт через PyRun_SimpleString, а затем: -)

Другой вариант: записать сам entity_test в python.

...