【问题标题】:Why is this 'from-import' failing with PyRun_SimpleString?为什么 PyRun_SimpleString 的“从导入”失败?
【发布时间】: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


【解决方案1】:

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

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

但如今(Vista 及之后),它的参与度更高。在阅读了关于旧 MSVCR DLL 的this interesting blog post 之后,我想我会尝试更新我的 .pyd 文件清单的 <dependency> 部分,以指向与位于 \Windows\WinSxS 中的 Python27.DLL 相同的 MSVCR90.DLL (并排)文件夹。

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

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 2018-10-14
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2021-09-14
    • 2019-12-21
    相关资源
    最近更新 更多