Почему PyImport Import не может загрузить модуль из текущего каталога?
Я пытаюсь запустить пример встраивания и я не могу загрузить модуль из текущего рабочего каталога, если я явно не добавлю его в sys.path затем он работает:
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(".")"); 
не должен ли Python искать модули в текущем каталоге ?
Edit1: попробовал просто импортировать модуль с:
Py_Initialize();
PyRun_SimpleString("import multiply"); 
и он по-прежнему терпит неудачу со следующей ошибкой:
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named multiply
Edit2: от sys.path docs:
если каталог скриптов недоступен (например, если интерпретатор вызывается интерактивно или если сценарий считывается из стандартного ввода), путь[0] - пустая строка, которая направляет Python для поиска модулей в текущем каталоге первый.
Не уверен, что значит недоступен, но если я распечатаю sys.path[0] он не пуст:
/usr/lib/pymodules/python2.7
3 ответов
нужно позвонить PySys_SetArgv(int argc, char **argv, int updatepath) для работы относительного импорта. Это добавит путь к исполняемому скрипту в sys.path Если updatepath is 0 (см. docs для получения дополнительной информации).
следующее должно сделать трюк
#include <Python.h>
int
main(int argc, char *argv[])
{
  Py_SetProgramName(argv[0]);  /* optional but recommended */
  Py_Initialize();
  PySys_SetArgv(argc, argv); // must call this to get sys.argv and relative imports
  PyRun_SimpleString("import os, sys\n"
                     "print sys.argv, \"\n\".join(sys.path)\n"
                     "print os.getcwd()\n"
                     "import thing\n" // import a relative module
                     "thing.printer()\n");
  Py_Finalize();
  return 0;
}
у меня была точно такая же проблема и я ее решила просто добавив Py_Initialize(); и Py_Finalize();
надеюсь, что может помочь вам
то, что я должен был сделать с python 3.5, это PySys_SetPath чтобы иметь возможность импортировать из cwd расположение:
QString qs = QDir::currentPath();
std::wstring ws = qs.toStdWString();
PySys_SetPath(ws.data());
на Qs в нем Qt.
