2013-07-02 2 views
1

Я пытаюсь запустить скрипт Python в C++-программе, используя Python.h. Поскольку эта программа C++ может быть установлена ​​(make install) в /usr/bin, она должна иметь возможность находить скрипт Python как в своем собственном каталоге (если он не был установлен), либо в одном из каталогов переменной среды PATH.Импорт скриптов Python из PATH в C++

Я пробовал делать:

PyObject *pName = PyString_FromString(scriptName); // scriptName is "file.py" as a char* 
PyRun_SimpleString("import sys"); 
PyRun_SimpleString("sys.path.append(\".\")"); 
PyObject *pModule = PyImport_Import(name); // not working because absolute path only 
              //since Python 2.7 ? 

и

PyRun_SimpleString("import sys"); 
PyRun_SimpleString("sys.path.append(\".\")"); 
PyObject *pModule = PyImport_ImportModuleEx(scriptName, NULL, NULL, NULL); 

Но и оставить меня с pModule == NULL после этого вызова, но работать, если я запустить модуль C++ из своей директории.

Большое спасибо за вашу помощь

+0

Немного вопросов: 1) Будет ли приложение запускаться из каталога, содержащего скрипт python? 2) Пробовали ли вы вызов PySys_SetArgvEx перед Py_Initialize и настройку пути приложения? –

+0

1) Абсолютно, 'make' помещает исполняемый файл C++ в тот же каталог, где находится скрипт Python. 'make install' копирует как исполняемый файл C++, так и скрипт Python в' usr/bin' (или там, где пользователь хочет их установить). 2) У меня нет, в основном потому, что эта часть программы на C++ довольно далека от «main» и, следовательно, исходных переменных «argc» и «argv». Нужно ли мне это делать, чтобы установить путь к приложению? – wrousseau

ответ

2

"." работают как путь к вашему питону сценариям, только если корневой каталог вашему C++ Python скрипта является текущими рабочим каталогом вашего процесса.

Если ваша программа была начата из другого места (либо через PATH или/путь/к/а/программы) тогда единственный надежный способ найти ваши сценарии, чтобы использовать использовать argv[0] параметров из main.

После того, как вы нашли правильный путь, есть два способа его использования:

  1. передать его sys.path.append
  2. переключателя рабочая директория там, используя chdir (от unistd.h), а затем вы можете пройти "." до sys.path.append. chdir повлияет на весь процесс, но профи в том, что вы можете сделать это прямо в main.
+0

Вот что я боюсь, из того, что я читал, изучение argv [0] не является полностью надежной вещью ... Спасибо за четкий ответ! – wrousseau