You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:27:02