__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.cfind_init_module(),它是find_module() 的一部分。不清楚为什么find_init_module() 没有执行或失败。

【讨论】:

以上是关于__init__.py 是 python 的后裔,但不是来自 c++;导致“导入 matplotlib”错误的主要内容,如果未能解决你的问题,请参考以下文章

Python __init__.py 作用详解

Python __init__.py 作用详解

python中 __init__.py的作用

Python之__init__函数及__init__.py

Python包中__init__.py作用

Python中__init__.py文件作用之我见