2012-04-13 184 views
3

我正在研究一个简单的(?)嵌入式Python项目。我有一个已安装到站点包用“的setup.py安装”自定义程序包,如:为什么这个'from-import'与PyRun_SimpleString失败?

在C:\ Python27 \ LIB \站点包\:

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窗口(不导入错误,我可以得到预期的结果如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,它为一切,除了 “从mypackage的进口MyModule的”。

此外:这个场景在MacOS/Python 2.7下工作得很好。它只是在Windows下,它失败了。

任何想法,这可能会脱轨?

UPDATE:一些附加信息:'subpackage.py'导入一个扩展库(我们称之为'utilites.pyd')。我可以导入其他“.py”模块,不会导入它。

+0

难道说实际的文件名和模块名称中有奇怪的字符吗? – 2012-04-13 20:22:43

+0

你会得到什么例外? – 2012-04-13 20:24:01

+0

PyRun_SimpleString不返回异常,只返回一个int(参见http://docs.python.org/c-api/veryhigh.html?highlight=pyrun_simplestring#PyRun_SimpleString)。 0表示成功,-1表示失败。正如我所提到的,在一个cmd窗口中,我没有任何异常或错误。 – djangodude 2012-04-13 20:26:08

回答

0

以难得的机会,回答我的问题...

有一次,我将问题范围缩小到了那个导入utilities.pyd扩展模块,我做了一些与Dependency Walker中的工具挖周围,发现加载MSVCR90.DLL时出现错误(未找到文件)。在过去,您可以将该DLL拖放到应用程序的路径中,并且通常可以工作。

但现在(Vista和之后),它有点更多的参与。在阅读this interesting blog post关于较老的MSVCR DLL后,我想我会尝试更新我的.pyd文件的清单的<dependency>部分,以指向驻留在\ Windows \ WinSxS中的Python27.DLL所在的MSVCR90.DLL(side-by文件夹。

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