如何通过已有.spec文件使用PyInstaller生成onedir格式程序包
问题原因
- 命令参数格式错误:PyInstaller的目录打包参数为
--onedir(两个短横线开头),你使用的-onedir参数无法被正确识别 - 现有spec本身是单文件格式配置:单文件打包的spec会将所有依赖资源全部传入EXE类生成单个可执行文件,onedir格式需要新增COLLECT块统一收集资源到目录
解决方法
直接修改spec文件即可实现onedir格式打包,修改后的完整spec内容如下:
# -*- mode: python ; coding: utf-8 -*- from PyInstaller.utils.hooks import collect_data_files datas = collect_data_files("scipy.special") block_cipher = None a = Analysis(['main_gui.py'], pathex=['C:\\Users\\User\\OneDrive\\Pulpit\\BulaniPunchWydanie\\main'], binaries=[], datas=datas, # 启用前面收集的scipy资源文件 hiddenimports=['scipy.special._ufuncs_cxx', 'scipy.linalg.cython_blas', 'scipy.linalg.cython_lapack', 'scipy.integrate', 'scipy.integrate.quadrature', 'scipy.integrate.odepack', 'scipy.integrate._odepack', 'scipy.integrate.quadpack', 'scipy.integrate._quadpack', 'scipy.integrate._ode', 'scipy.integrate.vode', 'scipy.integrate._dop', 'scipy.integrate.lsoda', # 补全原有缺失的逗号避免语法报错 'scipy.special.__init__'], runtime_hooks=[], excludes=['matplotlib', 'matplotlib.backends', 'PIL'], 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, [], # 移除所有资源文件传入,仅保留可执行程序启动逻辑 name='Bulani Punch', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False, icon='Punch_Logo.ico') # 新增COLLECT块,统一收集所有资源到目录,这是onedir格式的核心配置 coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='Bulani Punch')
打包执行
修改完成后直接运行以下命令即可生成onedir格式的程序包,不需要额外加格式参数:
pyinstaller filename.spec
内容的提问来源于stack exchange,提问作者Mateuszac
相关产品推荐
相关产品推荐

