为什么 PyRun_SimpleString 的“从导入”失败?

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”模块。

dja*_*ude 1

借此难得的机会回答我自己的问题......

当我将问题范围缩小到导入 utility.pyd 扩展的模块后,我使用 Dependency Walker 工具进行了一些挖掘,发现加载 MSVCR90.DLL 时出现错误(未找到文件)。在过去,您只需将该 DLL 放入应用程序的路径中,通常就可以正常工作。

但现在(Vista 及之后的版本),它的复杂程度更高了。在阅读了这篇关于较旧的 MSVCR DLL 的有趣博客文章后,我想我会尝试更新<dependency>.pyd 文件的清单部分,以指向与 Python27.DLL 相同的 MSVCR90.DLL,它驻留在 \Windows\WinSxS (侧面并排)文件夹。

在那之后,它就像一个魅力。现在我只需要弄清楚如何在 期间自动包含依赖项部分python setup.py mypackage,但这是另一个问题:-)