dja*_*ude 5 c python python-embedding python-c-api
我正在开发一个简单的(?)嵌入式 Python 项目。我有一个自定义包,已使用“setup.py install”安装到站点包中,例如:
在 C:\Python27\Lib\site-packages\ 中:
mypackage\
__init__.py
subpackage\
__init__.py
subpackage.py
....
mymodule.py
Run Code Online (Sandbox Code Playgroud)
只是做了一些简单的嵌入调用,我得到的一些行为与运行 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)
Run Code Online (Sandbox Code Playgroud)
...而所有这些在 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'])
Run Code Online (Sandbox Code Playgroud)
也尝试过PyImport_ImportModuleEx,与 PyRun_SimpleString 一样,它适用于除“from mypackage import mymodule”之外的所有内容。
此外:这个场景在 MacOS/Python 2.7 下运行得很好。只是在 Windows 下它失败了。
有什么想法可能会偏离轨道吗?
更新:一些附加信息:“subpackage.py”导入扩展库(我们称之为“utilites.pyd”)。我可以导入其他不导入此模块的“.py”模块。
借此难得的机会回答我自己的问题......
当我将问题范围缩小到导入 utility.pyd 扩展的模块后,我使用 Dependency Walker 工具进行了一些挖掘,发现加载 MSVCR90.DLL 时出现错误(未找到文件)。在过去,您只需将该 DLL 放入应用程序的路径中,通常就可以正常工作。
但现在(Vista 及之后的版本),它的复杂程度更高了。在阅读了这篇关于较旧的 MSVCR DLL 的有趣博客文章后,我想我会尝试更新<dependency>.pyd 文件的清单部分,以指向与 Python27.DLL 相同的 MSVCR90.DLL,它驻留在 \Windows\WinSxS (侧面并排)文件夹。
在那之后,它就像一个魅力。现在我只需要弄清楚如何在 期间自动包含依赖项部分python setup.py mypackage,但这是另一个问题:-)