Встраивание 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-функцию для вашей работы, но я не знаю ее.

Другие вопросы по тегам