2014-01-22 3 views
1

, используя следующую строкуPython Вложение: PyImport_Import не из текущего каталога

pModule = PyImport_Import(pName);

только загрузить модули из текущего каталога.

Но что я хочу загрузить из другого места? Есть ли опрятный способ сделать это?

PyRun_SimpleString("import sys\nsys.path.append('<dir>')"); работ, но это немного некрасиво - я ищу лучший способ

Спасибо!

+1

Действительно ли '

' в пути python? AFAIK 'PyImport_Import ()' должен быть таким же, как «импорт» . Если он не находится в пути python, то * почему * вы ожидаете его работы? Конечно, вы можете сделать 'sysModule = PyImport_Import (" sys ")', а затем получить доступ к 'sys.path' с помощью' PyObject_GetAttr' и вызывать 'PyList_Append' на нем, но он кажется даже дольше, чем с помощью' PyRun_SimpleString' (хотя он должен иметь меньше накладные расходы, так как он не должен компилировать и интерпретировать код. – Bakuriu

+0

@Bakuriu - я только что нашел ответ - ниже –

ответ

5

Просто нашел ответ, который я искал в 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 функция я написал, чтобы получить каталог.

-1

Существует хороший способ, так как это часто делается с помощью сайтов-пакетов.

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

+0

вы означали 'PyRun_SimpleString (" import sys \ nsys.path.append ('

') ");' Работы, но это немного уродливо - я ищу лучший способ –

+0

-1 вы даже не читали вопрос. – Bakuriu

+0

Спасибо, что указали это. Сейчас я прочитал вопрос. Я просто не мог классифицировать «уродливые «Пожалуйста, см. это как отрицательный пример, чтобы вы не получили никаких других таких ответов. – User

Смежные вопросы