2011-04-14 21 views
4

我想加載一個* .pyd與Python,但我收到衆所周知的「導入錯誤:DLL加載失敗:指定程序無法找到。「錯誤。* .pyd文件無法加載,但DependancyWalker出現乾淨,ProcMon顯示它加載

我已經做了以下內容:

1)調查*與Dependency Walker中.pyd。 GPSVC.DLL和IESHIMS.DLL出現丟失,但延遲加載,IEFRAME.DLL作爲缺少導出,但也延遲加載。這是我的理解,這些沒有使用,無論如何是延遲加載,所以他們不應該是問題。

2.)在python命令窗口的foo.pyd上有一個「import foo」,ProcMon正在觀察。 ProcMon在「foo.pyd」上顯示事件「LoadImage」,結果爲SUCCESS。

這似乎暗示* .pyd文件加載正確。

那麼我錯過了什麼。我的Windows診斷程序告訴我一切正常,但python告訴我無法加載的東西(通常是由於缺少DLL或符號)。

想法?

謝謝!

+0

更新:我建立了一個小程序來執行問題* .pyd上的LoadLibrary()。輸出顯示* .pyd正確加載,並且它的依賴關係(程序不需要* .pyd)也被正確加載和加載。 – Transformer2 2011-04-14 20:26:36

回答

4

您使用的是相同版本的Python的.pyd文件嗎?爲錯誤的Python版本加載.pyd文件可能會產生該錯誤消息。

Dependency Walker可以顯示你鏈接到哪個pythonNN.dll。

+0

它似乎是相同的版本。所有文檔說明它與Python 2.6協同工作,這正是我正在使用的。而Dependency Walker也顯示它與Python26.dll鏈接 – Transformer2 2011-04-14 20:18:00

+0

不同版本的python26.dll。這是問題。 – Transformer2 2011-04-17 03:46:49

1

如果您有一個文件foo.pyd,對於import foo要成功,必須有一個可從外部訪問的函數initfoo。如果它存在,Dependency Walker將顯示這個(通常是ONLY函數)。需要由Python調用initfoo來初始化foo模塊。

注:我希望更明確的錯誤消息,如果是這樣的問題:

>>> import fubar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: dynamic module does not define init function (initfubar) 
>>> 

你說你是「試圖加載* .pyd文件」。這只是描述import foo的一種奇怪的方式,還是其他的?

您是否創建了pyd?如果不是,誰做的?你問過他們嗎?這個pyd是否可以在網絡上使用,以便其他人可以嘗試加載/導入它?

+0

另一種可能性是init函數需要其中一個缺失的「延遲加載」DLL。 – ncoghlan 2011-04-15 06:56:03

+0

感謝您的意見。 * .pyd確實定義了initfoo,這是* .pyd中的唯一函數(如您所描述的)。 錯誤消息不是更加明確,表明失敗在Windows DLL加載系統中,其中python無法確定發生加載故障的位置。 – Transformer2 2011-04-16 14:22:37

1

確定這裏就是答案:

窗戶診斷(依賴,將procmon等)都顯示DLL(或PYD)裝載的罰款。

Python顯示它沒有正常加載。

我發現窗口工具指的是隱藏在我的C:\ Window \ SysWOW64文件夾中的一個不同的Python26.dll。

第二個Python26.dll(在SysWOW64中找到)有一個在主python26.dll中缺失的符號(由安裝在C:\ Python26中的windows python安裝程序安裝)。

這個符號「_PyByteArray_empty_string」,顯然是我的* .pyd文件需要的。

所以當通過Windows診斷加載時,找到了SysWOW64 DLL,並正確加載* .pyd。從python加載時,找到C:\ Python26 \中的dll,符號丟失,加載失敗。

所以這就是爲什麼問題表現出來。現在的問題是:爲什麼有兩個版本的Python26.dll左右浮動,一個是_PyByteArray_empty_string,另一個沒有?

我正在使用Python 2.6.6。也許這個符號在2.6.6中被刪除,但在一些較舊的2.6.x版本中出現?