PyInstaller生成可执行文件体积过大且资源需手动复制如何解决
PyInstaller打包问题解决方案
一、自动打包资源文件配置调整
1. 修改spec文件的datas参数
你当前spec中datas字段为空,这个参数就是用来配置需要自动打包的资源文件,格式为(资源本地路径, 打包后对应相对路径),示例配置如下:
datas=[ # 把本地img文件夹下所有文件打包到exe对应目录的assets/img路径下 ('./assets/img', './assets/img'), # 单个json文件直接写对应路径,.代表打包后放在exe同级目录 ('./config/app_setting.json', './config'), ('./logo.ico', '.') ]
2. 修改代码中资源加载逻辑
PyInstaller打包后运行时会自动生成临时目录_MEIPASS存放所有资源,需要统一适配开发/打包两种环境的资源路径:
import sys import os def get_resource_path(relative_path): # 打包后运行场景 if getattr(sys, '_MEIPASS', False): base_path = sys._MEIPASS # 开发调试场景 else: base_path = os.path.abspath('.') return os.path.join(base_path, relative_path) # 加载资源时调用该方法即可 config_path = get_resource_path('config/app_setting.json') img_path = get_resource_path('assets/img/confirm.png')
二、减小可执行文件体积的配置优化
- 开启strip裁剪:把spec中
strip=False改成strip=True,会自动去掉二进制文件中的调试符号,Windows环境需要提前安装MinGW的strip工具,Linux/macOS系统自带该功能。 - 排除无用依赖:在
excludes字段中加入所有项目未用到的第三方库,避免PyInstaller误打包冗余依赖,示例:excludes=['numpy', 'pandas', 'tkinter', 'matplotlib', 'PyQt5.QtWebEngine'] - 优化UPX压缩:你已经开启了
upx=True,可以在upx_exclude中加入不需要压缩的系统库,避免压缩后启动报错:upx_exclude=['vcruntime140.dll', 'msvcp140.dll'] - 使用虚拟环境打包:不要用全局Python环境打包,新建纯净虚拟环境只安装项目需要的依赖后再执行打包,体积可以减少30%~70%。
修改后的完整spec示例
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis(['ADP_Multi_Tool.py'], pathex=['C:\\Users\\sj3kc0\\wkspaces\\ADVRADAR_HIL_Replay_Tool'], binaries=[], datas=[ ('./assets/img', './assets/img'), ('./config/*.json', './config') ], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=['numpy', 'pandas', 'tkinter', 'matplotlib'], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='ADP_Multi_Tool', debug=False, bootloader_ignore_signals=False, strip=True, upx=True, upx_exclude=['vcruntime140.dll', 'msvcp140.dll'], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, target_arch=None, codesign_identity=None, entitlements_file=None )
内容的提问来源于stack exchange,提问作者deepan
相关产品推荐
相关产品推荐

