我正在尝试使用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或符号)。
想法?
谢谢!
答案 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版本中出现了?