使用py2exe打包exe后跨PC运行报错:DLL加载失败
解决py2exe打包psutil后跨PC运行DLL缺失的问题
这种情况我之前踩过坑!问题根本不是psutil的Python模块没打包进去——你看到的dist/library/psutil里的文件确实都在,但psutil的底层模块(_psutil_windows.pyd)依赖的Windows系统级DLL没被py2exe打包,而你的开发机上本来就有这些DLL,所以本地运行正常,目标PC没有就报错了。
下面给你几个靠谱的解决思路:
1. 先定位到底缺哪个DLL
首先得明确是哪个系统DLL找不到,别瞎猜:
- 用Dependency Walker工具打开
dist/library/psutil/_psutil_windows.pyd,它会列出所有依赖的DLL,标红的就是缺失的(通常是VC++运行库相关的,比如vcruntime140.dll、msvcp140.dll这类)。 - 或者在目标PC上打开「事件查看器」→「Windows日志」→「应用程序」,里面的错误日志会直接告诉你缺失的DLL名称,更准确。
2. 手动补全DLL快速解决
找到缺失的DLL后:
- 从你的开发机的
C:\Windows\System32(64位系统)或C:\Windows\SysWOW64(32位程序)里复制对应的DLL文件。 - 把它放到
dist文件夹的根目录(和你的Agent.exe同目录),再复制到目标PC试试,基本就能跑起来了。
3. 修改打包脚本,让py2exe自动包含依赖
如果你想一劳永逸,修改你的setup.py,把需要的DLL加入打包列表:
from distutils.core import setup import py2exe import psutil import os # 获取psutil底层pyd文件的路径 psutil_pyd_path = os.path.join(os.path.dirname(psutil.__file__), "_psutil_windows.pyd") # 替换成你找到的缺失DLL的路径,比如vcruntime140.dll missing_dll_path = "C:/Windows/System32/vcruntime140.dll" setup( console=['Agent.py'], # 如果是GUI程序就改成windows=['Agent.py'] data_files=[ ('.', [psutil_pyd_path, missing_dll_path]) # 把文件打包到exe同目录 ], options={ 'py2exe': { 'packages': ['psutil'], 'includes': ['psutil._psutil_windows'] # 强制包含psutil的底层模块 } } )
重新打包后,DLL就会自动跟着dist文件夹走了。
4. 换用更省心的打包工具(推荐)
说实话,py2exe对现代Python库的依赖处理已经有点跟不上了,推荐换成PyInstaller——它会自动扫描所有依赖的DLL和模块,打包更彻底:
- 先安装PyInstaller:
pip install pyinstaller - 打包命令(单文件模式,方便分发):
pyinstaller --onefile Agent.py - 生成的exe在
dist文件夹里,直接复制到目标PC就能运行,基本不会碰到这种DLL缺失的问题。
额外注意点
- 确保开发机和目标PC的系统位数一致(32位/64位),不然DLL不兼容会报错。
- 如果缺失的是VC运行库,也可以让目标用户直接安装对应的「Microsoft Visual C Redistributable」包(比如2015-2022版本),这是更规范的做法,不用手动复制DLL。
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

