__init__.py 是 python 的后裔,但不是来自 c++;导致“导入 matplotlib”错误
Posted
技术标签:
【中文标题】__init__.py 是 python 的后裔,但不是来自 c++;导致“导入 matplotlib”错误【英文标题】:__init__.py descends dirtree for python, but not from c++; causes "import matplotlib" error 【发布时间】:2009-10-27 22:55:15 【问题描述】:文件__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(和其他需要的包)走得更远;但是,我似乎无法
包括导入matplotlib.cbook
的路径。
【问题讨论】:
【参考方案1】:查看(不同版本的)python,我看到import.c
有find_init_module()
,它是find_module()
的一部分。不清楚为什么find_init_module()
没有执行或失败。
【讨论】:
以上是关于__init__.py 是 python 的后裔,但不是来自 c++;导致“导入 matplotlib”错误的主要内容,如果未能解决你的问题,请参考以下文章