为什么这个pyd文件在某些计算机上无法导入?
我的Python项目里有一个C++的部分,它被编译成一个.pyd文件,并放在一个Python的包里。我发现这个文件在我们一些全新的64位Windows服务器上似乎不兼容。我们有4台(据说)配置完全相同的机器——每台都运行64位的Windows 2003服务器,但其中2台机器让我无法调用这个包里的函数。
经过一些实验,我找到了一种方法来重现这个错误。问题似乎出现在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文件——奇怪的是,这个文件已经在成千上万的电脑和几十台其他服务器上使用过,其中很多也是配置相同的64位机器。这个项目在开发和发布后都在持续测试,所以如果这个东西真的不稳定,我们早就知道了。这个组件被认为是稳定的代码,所以它出现这么大的问题真让人意外。
有什么建议可以帮助我调试这个麻烦的库吗?现在欢迎任何疯狂的想法,因为我们已经用尽了所有合理的办法。
谢谢!
更新 0:好的,我使用进程监视器比较了一台失败的64位服务器和另一台正常工作的服务器。我发现问题似乎是由于缺少一个DLL文件,SysWOW64/mscoreee.dll——你知道这个组件是什么吗?我可以把这个反馈给我们的IT部门,他们可以安装相关的东西。
5 个回答
根据微软的知识库,mscoree.dll是.NET框架的一部分。更准确地说,它是微软的.NET运行时执行引擎。
如果你想要获取这个文件,可以通过(重新)安装.NET框架来实现。
你有没有试过查看一下PYD文件链接了哪些DLL文件? 你可以使用一些工具来做到这一点,比如Dependency Walker或者VS里的depends.exe。
你可以试试像 Process Monitor 这样的工具,来观察它尝试加载哪些DLL文件。我猜可能是它依赖的某个DLL找不到了。
补充一下:看起来你已经从中获得了一些有用的信息,但我可以告诉你怎么减少procmon产生的信息量。
你可以使用过滤功能,指定命令行(在这个例子中,就是要求命令行包含python)。这样你就只会看到你感兴趣的进程的信息。接着,你可以过滤掉所有成功的结果,这样就能看到它在寻找哪个DLL。
当然,还有很多其他的过滤选项,但这是我过去得到结果的方法。在这种情况下,这个工具真的很方便,可以帮助你搞清楚发生了什么。
(像depends或DependencyWalker这样的工具也很好用,可以帮助你找出一个库依赖哪些DLL - 它们提供的是静态信息,而procmon则展示动态视图。这两个工具都很有用。)