文件为什么或如何__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__
和/或递归,以便找到请求的包。如果是这样,如何?
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++ 调用 python 脚本时,如果/opt/epd/lib/python2.5/site-packages/matplotlib
找不到文件(或其变体、matplotlib.so 等),搜索似乎会停止。
请注意,我可以增加 PYTHONPATH 以包括 matplotlib(和其他需要的包)的确切位置以更远;但是,我似乎无法包含 import 的路径matplotlib.cbook
。