如何使用py2exe打包psutil?

3
该应用在我的开发Win8环境中运行良好,但当它通过py2exe打包并在生产机器上运行时,会抛出异常:
"The procedure entry point RtlIdnToAscii could not be located in the dynamic link library ntdll.dll"
日志文件的详细内容如下:
Traceback (most recent call last):
  File "DataviewerBackupRestorer.py", line 6, in <module>
  File "RestorController.pyc", line 7, in <module>
  File "psutil\__init__.pyc", line 136, in <module>
  File "psutil\_psmswindows.pyc", line 14, in <module>
  File "_psutil_mswindows.pyc", line 12, in <module>
  File "_psutil_mswindows.pyc", line 10, in __load
ImportError: DLL load failed: The specified procedure could not be found.

在打包过程中,psutil所需的一个dll似乎丢失了。我尝试使用以下py2exe选项进行添加:

py2exe_options = {"py2exe":{"includes":['decimal', '_mssql', 'uuid', 'psutil', '_psutil_mswindows']}}

但是它没有起作用。有什么想法吗?提前感谢!

我正在努力解决完全相同的问题,所以我不能给你一个答案,但我相信 py2exe 给出的消息 "以下模块似乎丢失" 可能与问题有关。下面列出的很多内容都涉及到 psutil。丢失的模块是 _psutil_bsd、_psutil_linux、_psutil_osx、_psutil_posix 和 _psutil_sunos。奇怪的是,缺少的 _psutil_mswindows 没有在那里。 - trevorKirkby
顺便提一下,DLL文件应该使用安装程序中的“resource_files”选项进行打包,而“includes”选项仅适用于由于某些原因未能被包含的Python模块。 - trevorKirkby
@某某某,感谢您的建议,我已经通过将几个dll添加到排除列表中来解决了这个问题。这些是py2exe_options = {"py2exe":{"includes": ['decimal', '_mssql', 'uuid'], "dll_excludes":["mswsock.dll", "powrprof.dll", "user32.dll", "shell32.dll", "wsock32.dll", "advapi32.dll", "kernel32.dll", "ntwdblib.dll", "ws2_32.dll", "oleaut32.dll", "ole32.dll"], }} - Erxin
@某人,我重新检查了我的代码,我只是绕过了问题但并没有修复它。我使用wmi(https://pypi.python.org/pypi/WMI/)和操作系统的默认命令行来完成工作。再次感谢您的分享。 - Erxin
我现在也正在使用WMI :) - trevorKirkby
1个回答

3

解决方案是从项目目录中删除系统DLL文件。当我将psutil添加到我的应用程序中时,py2exe向我的项目中添加了许多系统DLL文件。它在我的电脑和其他一些电脑上运行正常,但在另一台电脑上失败了。从项目中删除C:\Windows\System32中可用的.dll文件可以解决此问题。

最终,在我的情况下,解决方案是添加:

            'dll_excludes': [ "IPHLPAPI.DLL", "NSI.dll",  "WINNSI.DLL",  "WTSAPI32.dll"]

在setup.py文件中加入py2exe选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接