Встраивание Python: PyImport_Import не из текущего каталога
Используя следующую строку
pModule = PyImport_Import(pName);
Загружайте только модули из текущего каталога.
Но что я хочу загрузить откуда-то еще? Есть ли аккуратный способ сделать это?
PyRun_SimpleString("import sys\nsys.path.append('<dir>')");
Работает, но это немного некрасиво - я ищу лучший способ
Спасибо!
2 ответа
Только что нашел ответ, который искал на http://realmike.org/blog/2012/07/08/embedding-python-tutorial-part-1/
Обычно при импорте модуля Python пытается найти файл модуля рядом с импортирующим модулем (модуль, который содержит оператор импорта). Затем Python пробует каталоги в "sys.path". Текущий рабочий каталог обычно не учитывается. В нашем случае импорт выполняется через API, поэтому нет модуля импорта, в каталоге которого Python мог бы выполнить поиск "shout_filter.py". Плагин также не находится в "sys.path". Один из способов позволить Python найти плагин - это добавить текущий рабочий каталог в путь поиска модуля, выполнив эквивалент "sys.path.append('.')" Через API.
Py_Initialize();
PyObject* sysPath = PySys_GetObject((char*)"path");
PyObject* programName = PyString_FromString(SplitFilename(argv[1]).c_str());
PyList_Append(sysPath, programName);
Py_DECREF(programName);
SplitFilename
это функция, которую я написал, чтобы получить каталог.
Есть хороший способ, потому что так часто делают с пакетами сайтов.
import sys
sys.path.append(directory) # sys.path is a list of all directories to import from
или вы используете
os.cwd(directory) # change the working directory
до импорта.
Другой способ уродлив:
import types, sys
m = types.ModuleType('module')
sys.modules['module'] = m
exec open('file').read() in m.__dict__ # python3
Может быть, вы попросили C-функцию для вашей работы, но я не знаю ее.