为什么这个“从导入”失败了PyRun_SimpleString?

时间:2012-04-13 20:19:08

标签: python c python-c-api python-embedding

我正在开发一个简单的(?)嵌入式Python项目。我有一个自定义包已经安装到带有'setup.py install'的site-packages中,例如:

在C:\ Python27 \ Lib \ site-packages \中:

mypackage\
    __init__.py
    subpackage\
        __init__.py
        subpackage.py
    .... 
    mymodule.py

mypackage\ __init__.py subpackage\ __init__.py subpackage.py .... mymodule.py

只是做一些简单的嵌入调用,我得到的一些行为与我在运行Python的cmd窗口中得到的行为不匹配。具体做法是:

...所有这些在cmd窗口中工作得很好(没有ImportError,我可以在例如PyRun_SimpleString("import mypackage") //Success (return == 0) PyRun_SimpleString("from mypackage import subpackage") //Success PyRun_SimpleString("from mypackage import mymodule") //Fail (return == -1)

上得到预期的结果

我知道dir(mymodule)产生的解释器与你在cmd窗口中得到的解释器有点不同,特别是sys.path ...已经阅读了一些其他的答案我尝试插入''作为sys.path的第一个元素: 在导入失败之前Py_Initialize(),但没有运气,仍然返回-1。还尝试使用'C:\ Python27 \ Lib \ site-packages \ mypackage'附加sys.path,但仍然无法导入'mymodule'(mymodule.py)。

基于SO和其他网站上的其他示例,我在导入时尝试了一些变体,例如

PyRun_SimpleString("import sys\nsys.path.insert(0,'')")

还尝试__import__('mypackage',globals(), locals(), fromlist=['mymodule']) __import__('mypackage.mymodule',globals(), locals(), fromlist=['mymodule']) 和PyRun_SimpleString一样,除了“来自mypackage import mymodule”之外,它适用于所有内容。

此外:这种情况在MacOS / Python 2.7下运行得很好。它只是在Windows下失败了。

有什么想法可能会脱轨?

更新:一些额外的信息:'subpackage.py'导入扩展库(我们称之为'utilites.pyd')。我可以导入其他不导入它的“.py”模块。

1 个答案:

答案 0 :(得分:0)

抓住难得的机会回答我自己的问题......

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

但是现在(Vista和之后),它涉及的更多一些。在阅读this interesting blog post关于旧的MSVCR DLL之后,我想我会尝试更新.pyd文件清单的<dependency>部分,指向与Python27.DLL相同的MSVCR90.DLL。 \ Windows \ WinSxS(并排)文件夹。

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

相关问题