为什么这个pyd文件不能在某些计算机上导入?

时间:2009-04-15 11:45:06

标签: python windows

我的python项目有一个C ++组件,它在Python egg中作为.pyd文件进行编译和分发。我注意到它似乎与我们的一些全新的64位Windows服务器不兼容。我们有4台(据称)相同配置的机器 - 每台机器运行Windows 2003服务器64位版本,但其中2台机器不允许我调用鸡蛋中的功能。

经过一些实验,我找到了producing a reproducible error的食谱。当Python尝试导入pyd文件时,似乎会出现问题。

我将pyd复制到临时文件夹并从该位置运行Python.exe,顺便说一句,我们仍在使用32位版本的Python 2.4.4,因为我们的库都没有移植到64位架构。接下来我尝试导入我的模块(称为pyccalyon)。我第一次尝试这个时收到一条错误消息:

"ImportError: DLL load failed: The specified module could not be found"

下次我尝试这个时,python解释器崩溃了:没有堆栈跟踪!

当然你怀疑我的PYD - 关于这一点的奇怪之处在于它已经在数千台PC和10台其他服务器上使用,其中许多是相同规格的64位机器。该项目在开发和发布后都会不断进行测试,所以如果这个东西非常不稳定,我们很久以前就会知道它。这个组件被认为是稳定的代码,因此令人惊讶的是,它的突破性非常强大。

有什么建议我可以做些什么来调试这个麻烦的库?在这一点上,疯狂的想法很受欢迎,因为我们已经用尽了所有明智的想法。

谢谢!

更新0 :好的使用进程监视器我能够将一个失败的64位服务器与另一个运行良好的服务器进行比较。我发现破损似乎是由于缺少DLL,SysWOW64 / mscoreee.dll而发生的 - 任何想法这个组件是什么以及我可以在哪里得到它?我可以将此问题反馈给可以安装内容的IT配置人员。

5 个答案:

答案 0 :(得分:5)

您可以尝试使用Process Monitor之类的内容来查看它尝试加载的DLL。我假设找不到它所依赖的其他DLL之一。

编辑:看起来你已经设法从中获取了一些有用的信息,但我会澄清你如何减少procmon产生的大量信息。

使用filter函数指定命令行(在这种情况下,要求命令行包含python)。这将仅显示您感兴趣的过程中的消息。然后您可以过滤掉所有成功结果,以便您可以查看它正在查找的DLL。

显然,你可以过滤很多其他东西,但这就是我过去得到的结果。这是一个非常方便的工具,用于解决在这种情况下发生的事情。

(depends或DependencyWalker等工具也适用于查找库所依赖的DLL - 它们提供静态信息,而procmon将显示动态视图。它们都很有用。)

答案 1 :(得分:4)

您是否尝试过检查PYD链接的DLL? 例如,您可以使用Dependency Walker或VS的depends.exe。

答案 2 :(得分:2)

根据Microsoft's Knowledgebase,mscoree.dll是.NET Framework的一部分。确切地说,它是Microsoft .NET运行时执行引擎。

获得它的方法是(重新)安装.NET Framework。

答案 3 :(得分:1)

也许你错过了它不起作用的机器上的C ++运行时/标准库DLL,并且该模块正在尝试使用它们?

答案 4 :(得分:0)

刚出现同样的问题,depends.exe向我显示foo.pyd是使用python25.lib而不是python27.lib构建的。所以它找不到python25.dll