我正在尝试使用Python加载*.pyd,但收到了众所周知的“导入错误: DLL加载失败:无法找到指定的过程”。错误。
我已经做了以下工作:
1.)已使用依赖关系遍历程序调查了*.pyd。GPSVC.DLL和IESHIMS.DLL是缺失的,但延迟加载,IEFRAME.DLL也是缺失导出,但也是延迟加载的。据我所知,它们没有被使用,而且无论如何都是延迟加载,所以它们不应该是问题。
2.)在ProcMon监视的情况下,在python命令窗口中对foo.pyd执行了"import foo“。ProcMon在"foo.pyd“上显示事件"LoadImage”,结果成功。
这似乎意味着*.pyd文件加载正确。
那么我错过了什么。我的windows诊断程序告诉我一切正常,但是python告诉我东西无法加载(通常是由于缺少dll或符号)。
想法?
谢谢!
发布于 2011-04-15 04:07:43
.pyd文件是否与您正在使用的Python版本相同?为错误的.pyd版本加载Python文件可能会产生该错误消息。
Dependency Walker可以向您显示它链接到哪个pythonNN.dll。
发布于 2011-04-15 07:29:30
如果您有一个文件foo.pyd,为了使import foo成功,必须有一个可从外部访问的名为initfoo的函数。如果它存在,Dependency Walker将显示它(通常是唯一的函数)。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是否可以在web上使用,以便其他人可以尝试加载/导入它?
发布于 2011-04-16 22:21:48
好的,这是答案:
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版本中出现了?
https://stackoverflow.com/questions/5667556
复制相似问题