2009-10-27 8 views
0

Pourquoi ou comment le fichier __init__.py fait-il rechercher par l'interpréteur python des sous-répertoires pour un module - et pourquoi l'interpréteur n'honore-t-il pas cette convention lorsqu'il est appelé à partir de C++?__init__.py descend de dirtree pour python, mais pas de C++; provoque l'erreur "import matplotlib"

Voici ce que je sais:

En utilisant strace sur mon programme, je peux voir que le même interprète python2.5 est en cours d'exécution à la fois le cas interactif et l' C++ invocation.

Dans les deux cas, le PYTHONPATH dirige la recherche pour le module importé en question (matplotlib). Cela apparaît comme une série d'appels open(), à partir du répertoire de travail en cours et s'étendant au PYTHONPATH (ici, /opt/epd/lib/python2.5/site-packages), et enfin dans les sous-répertoires, dans le cas de travail.

La divulgation complète est que je me sers de la distribution « Enthought » et a dû lieu le fichier __init__.py dans le répertoire site-packages et placez le répertoire site-packages dans le PYTHONPATH pour créer le cas de travail.

Le code est ci-dessous. Il semble que je puisse avoir besoin de faire un appel pour configurer l'interpréteur python pour rechercher __init__ et/ou recurse, afin de trouver les paquets demandés . SI C'EST LE CAS, COMMENT??

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; 

Lorsque le script python est appelé à partir C++, la recherche semble arrêt lorsque le fichier /opt/epd/lib/python2.5/site-packages/matplotlib (ou il est variante, matplotlib.so, etc.) ne sont pas trouvés.

Notez que je peux augmenter le PYTHONPATH pour inclure l'emplacement exact de matplotlib (et d'autres paquets nécessaires) pour aller plus loin; cependant, je ne peux pas sembler pour inclure un chemin pour importer matplotlib.cbook.

Répondre

0

En regardant (une version différente de) python, je vois que import.c a le find_init_module(), qui est une partie du find_module(). Pas évident pourquoi find_init_module() n'est pas exécuté ou échoue.