* .pyd文件无法加载,但DependancyWalker清理干净,ProcMon显示它已加载

时间:2011-04-14 18:05:56

标签: python dll procmon pyd

我正在尝试使用Python加载* .pyd,但我收到众所周知的“导入错误:DLL加载失败:无法找到指定的过程”。错误。

我已经完成了以下工作:

1。)使用Dependency Walker调查* .pyd。 GPSVC.DLL和IESHIMS.DLL出现了缺失,但延迟加载,IEFRAME.DLL aslo出现错过导出,但也是延迟加载。我的理解是这些都没有使用,无论如何都是延迟加载,所以它们应该不是问题。

2。)在python命令窗口中,foo.pyd上有一个“import foo”,ProcMon正在观看。 ProcMon在“foo.pyd”上显示事件“LoadImage”,结果为SUCCESS。

这似乎意味着正确加载了* .pyd文件。

所以我错过了什么。我的Windows诊断程序告诉我一切都很好,但python告诉我无法加载的东西(通常是由于缺少dll或符号)。

想法?

谢谢!

3 个答案:

答案 0 :(得分:4)

您正在使用的相同版本的Python的.pyd文件是什么?为错误的Python版本加载.pyd文件会产生该错误消息。

Dependency Walker可以显示它链接到哪个pythonNN.dll。

答案 1 :(得分: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是否可以在网上获得,以便其他人可以尝试加载/导入它?

答案 2 :(得分:1)

好的,答案是:

Windows诊断(依赖,procmon等)显示DLL(或pyd)正常加载。

Python显示它没有正常加载。

我发现Windows工具指的是隐藏在我的C:\ Window \ SysWOW64文件夹中的不同Python26.dll。

第二个Python26.dll(在SysWOW64中找到)在主python26.dll中缺少一个符号(由Windows python安装程序安装,在C:\ Python26中找到)。

我的* .pyd文件显然需要此符号“_PyByteArray_empty_string”。

因此,当通过Windows诊断程序加载时,找到了SysWOW64 dll,并正确加载了* .pyd。从python加载时,找到C:\ Python26 \中的dll,符号丢失,加载失败。

这就是为什么问题出现了。现在的问题是:为什么有两个版本的Python26.dll浮动,一个带_PyByteArray_empty_string,一个没有?

我正在使用Python 2.6.6。也许这个符号在2.6.6中删除了,但在一些较旧的2.6.x版本中出现了?