PyInstaller打包PySide2程序体积过大,能否精简后生成单文件或指定打包内容
PyInstaller打包PySide2 GUI应用体积过大解决方案
针对需求a:手动精简dist文件夹后生成单文件可执行程序
完全可以实现,操作步骤如下:
- 先以非
--onefile模式正常打包,运行程序确认功能无误后,手动删除dist目录下所有确认不需要的PySide2组件(如QtBluetooth.dll、QtCharts.dll、QtQuick/QtQml相关的所有库、多余翻译文件等),再次启动主程序验证功能正常。 - 无需再次调用PyInstaller,直接使用7-Zip的自解压打包功能生成单文件:选中精简后dist目录内的所有文件,右键选择添加到压缩包,压缩格式选7z,勾选「创建自解压压缩包」,进入自解压设置界面,将解压路径设置为系统临时目录,启动程序项选择你的主exe文件,确认生成即可。最终生成的单文件体积会比原生PyInstaller onefile模式小30%以上。
针对需求b:打包时指定需要包含的PySide2内容
可以通过PyInstaller的排除规则直接实现,无需后续手动删文件,有两种常用配置方式:
方式1:打包命令直接加排除参数
在打包命令中通过--exclude-module参数逐个排除不需要的PySide2模块,示例命令如下:
pyinstaller --onefile --windowed --exclude-module PySide2.QtBluetooth --exclude-module PySide2.QtCharts --exclude-module PySide2.QtQuick --exclude-module PySide2.QtQml --exclude-module PySide2.QtMultimedia 你的脚本名.py
你可以根据自己的使用场景,把所有确定不需要的Qt模块都加入排除列表即可。
方式2:通过spec文件配置(适合多排除项场景)
- 先生成spec配置文件:运行
pyi-makespec --onefile --windowed 你的脚本名.py - 打开生成的
.spec文件,找到excludes参数对应的列表,把所有不需要的PySide2模块都添加到列表中,示例:
a = Analysis( ['你的脚本名.py'], pathex=[], binaries=[], datas=[], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=['PySide2.QtBluetooth', 'PySide2.QtCharts', 'PySide2.QtQuick', 'PySide2.QtQml', 'PySide2.QtMultimedia'], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, )
- 保存后运行
pyinstaller 你的脚本名.spec即可完成打包。
额外优化建议
如果还需要进一步压小体积,可以添加UPX压缩支持:下载UPX工具解压到本地后,在打包命令中添加--upx-dir UPX所在目录路径参数,通常可以再压缩20%-30%的体积。
注意:每次修改打包规则后,都需要删除旧的build、dist文件夹和spec文件,避免缓存导致排除规则不生效。
内容的提问来源于stack exchange,提问作者Caterpillaraoz
相关产品推荐
相关产品推荐

