2012-04-13 51 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期間自動包含依賴項部分,但這是另一個問題:-)