__init__.py спускается из-за Python, но не из c ++; вызывает ошибку "import matplotlib" - PullRequest
0 голосов
/ 28 октября 2009

Почему или как файл __init__.py заставляет интерпретатор python искать подкаталоги для модуля - и почему переводчик не соблюдает это соглашение при вызове из C ++?

Вот что я знаю:

Используя strace в моей программе, я вижу, что то же самое интерпретатор python2.5 выполняется как для интерактивного случая, так и для C ++ вызов.

В обоих случаях PYTHONPATH направляет поиск соответствующего импортируемого модуля (matplotlib). Это выглядит как серия вызовов open (), начиная с текущего рабочего каталога и простирающийся до PYTHONPATH (здесь /opt/epd/lib/python2.5/site-packages), и наконец, в подкаталоги, в рабочем случае.

Полное раскрытие заключается в том, что я использую дистрибутив "Enthought" и должен был поместите файл __init__.py в каталог site-packages и поместите site-packages каталог в PYTHONPATH для создания рабочего кейса.

Код ниже. Кажется, что мне может понадобиться позвонить, чтобы настроить интерпретатор Python для поиска __init__ и / или recurse, чтобы найти запрошенные пакеты. ЕСЛИ ТАК, КАК ??

PyObject* main_module, * global_dict, * expression, *args, *spec;

Py_Initialize ();

char* script = "abc.py";
PySys_SetArgv(1, &script);

//Open the file containing the python modules we want to run
FILE* file_1 = fopen("abc.py", "r");
if (file_1 == 0) fprintf(stdout, "ERROR: File not opened");

//Loads the python file into the interpreter
PyRun_SimpleFile(file_1, "abc.py");

//Creates a python object that contains references to the functions and classes in abc.py 
main_module = PyImport_AddModule("__main__");
global_dict = PyModule_GetDict(main_module);

expression = PyDict_GetItemString(global_dict, "view_gui");
spec       = PyObject_CallObject(expression, NULL);

PyObject_CallMethod(spec, "shutdown", NULL);
Py_Finalize();

return NULL;

Когда скрипт на Python вызывается из C ++, поиск кажется остановить, когда файл /opt/epd/lib/python2.5/site-packages/matplotlib (или это вариант, matplotlib.so и т. д.) не найдены.

Обратите внимание, что я могу увеличить PYTHONPATH, указав точное местоположение Matplotlib (и другие необходимые пакеты), чтобы получить дальше; однако я не могу показаться включить путь для импорта matplotlib.cbook.

1 Ответ

0 голосов
/ 28 октября 2009

Глядя на (другую версию #) python, я вижу, что import.c имеет find_init_module(), который является частью find_module(). Непонятно, почему find_init_module() не выполняется или не выполняется.

...