4

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

我已经做了以下事情:

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 或符号)。

想法?

谢谢!

4

3 回答 3

4

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

Dependency Walker 可以向您显示它链接到的 pythonNN.dll。

于 2011-04-14T20:07:42.927 回答
1

如果你有一个文件foo.pydimport foo要成功,必须有一个名为 initfoo. 如果存在,Dependency Walker 将显示它(通常是唯一的功能)。initfoo需要由 Python 调用来初始化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 在网络上是否可用,以便其他人可以尝试加载/导入它?

于 2011-04-14T23:29:30.443 回答
1

好的,这是答案:

Windows 诊断程序(depends、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 版本中出现?

于 2011-04-16T14:21:47.620 回答