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

2024-04-18 23:36:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Python项目有一个C++组件,它被编译为python蛋内的.pyd文件。我注意到它似乎与我们的一些全新64位Windows服务器不兼容。我们有4台(据称)相同配置的机器—每台都运行Windows2003Server64位版本,但其中2台不允许我调用egg中的函数。

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

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

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

下一次我尝试时,python解释器崩溃了:根本没有stacktrace!

很自然你会怀疑我的PYD——奇怪的是,它已经在成千上万台PC机和其他10台服务器上使用,其中许多都是相同规格的64位计算机。这个项目在开发和发布后都会不断地测试,所以如果这个东西是如此的火热,我们早就知道了。这个组件被认为是稳定的代码,所以令人惊讶的是它的崩溃如此惊人。

对如何调试这个麻烦的库有什么建议吗?疯狂的想法在这一点上是受欢迎的,因为我们已经用尽了所有明智的想法。

谢谢!

更新0:好的,使用Process monitor,我能够比较一个64位服务器失败与另一个工作正常。我发现损坏似乎是由于缺少DLL SysWOW64/mscoreee.DLL造成的-知道这个组件是什么吗?知道在哪里可以得到它吗?我可以把这个交给我们的IT供应人员,他们可以安装东西。


Tags: 文件项目函数版本服务器机器eggwindows
3条回答

您可以尝试Process Monitor之类的方法,查看它试图加载的dll。我假设它所依赖的其他dll之一找不到。

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

使用filter函数指定命令行(在本例中,要求命令行包含python)。这将只显示您感兴趣的进程中的消息。然后你可以过滤掉所有的成功结果,这样你就可以看到它在寻找哪个DLL。

显然还有很多其他的东西你可以过滤掉,但这就是我在过去得到的结果。这是一个非常方便的工具,可以用来计算在这种情况下发生了什么。

(DependencyWalker或DependencyWalker之类的工具也有助于找出库所依赖的dll—它们提供静态信息,而procmon将向您显示动态视图。两者都可能有用。)

你试过检查PYD链接的dll吗? 例如,您可以使用Dependency Walker或VS's depends.exe执行此操作。

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

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

相关问题 更多 >