2009-10-27 3 views
0

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

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

Использование Трассирования на моей программе, я могу видеть, что то же самое 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; 

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

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

ответ

0

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