【发布时间】:2012-04-13 20:19:08
【问题描述】:
我正在开发一个简单的(?)嵌入式 Python 项目。我有一个自定义包,它已通过“setup.py install”安装到站点包中,例如:
在 C:\Python27\Lib\site-packages\ 中:
mypackage\
__init__.py
subpackage\
__init__.py
subpackage.py
....
mymodule.py
只是做一些简单的嵌入调用,我得到的一些行为与我在运行 Python 的 cmd 窗口中得到的不匹配。具体来说:
PyRun_SimpleString("import mypackage") //Success (return == 0)
PyRun_SimpleString("from mypackage import subpackage") //Success
PyRun_SimpleString("from mypackage import mymodule") //Fail (return == -1)
...而所有这些在 cmd 窗口中都可以正常工作(没有 ImportError,我可以在例如 dir(mymodule)
我知道Py_Initialize() 产生的解释器与您在 cmd 窗口中得到的解释器略有不同,尤其是 sys.path...在阅读了其他一些答案后,我尝试插入 ''作为 sys.path 的第一个元素:
PyRun_SimpleString("import sys\nsys.path.insert(0,'')") 在导入失败之前,但没有运气,仍然返回 -1。还尝试将 sys.path 附加到“C:\Python27\Lib\site-packages\mypackage”,但导入“mymodule”(mymodule.py)仍然没有运气。
基于 SO 和其他网站上的其他示例,我尝试了一些关于导入的变体,例如
__import__('mypackage',globals(), locals(), fromlist=['mymodule'])
__import__('mypackage.mymodule',globals(), locals(), fromlist=['mymodule'])
还尝试了PyImport_ImportModuleEx,并且与 PyRun_SimpleString 一样,它适用于除“from mypackage import mymodule”之外的所有内容。
此外:此方案在 MacOS/Python 2.7 下运行良好。它只是在 Windows 下失败了。
有什么想法可能会偏离轨道吗?
更新:一些附加信息:“subpackage.py”导入一个扩展库(我们称之为“utilites.pyd”)。我可以导入其他不导入它的“.py”模块。
【问题讨论】:
-
会不会是实际的文件名和模块名中有奇怪的字符?
-
PyRun_SimpleString 不返回异常,只返回一个 int(参见 docs.python.org/c-api/…)。 0 表示成功,-1 表示失败。正如我所提到的,在 cmd 窗口中,我根本没有收到任何异常或错误。
-
@SimeonVisser:不,在这种情况下不是。所有文件/文件夹名称仅包含 [A-Za-z] 集中的字符,当然还有“.”。那里没有什么不寻常的。
标签: python c python-c-api python-embedding