如何阻止PyInstaller打包时添加不必要的无关文件
你配置的excludes参数不生效是因为该参数仅用于排除Python导入模块,无法过滤静态资源、数据文件。无关文件被打包通常是两个原因:一是datas配置规则过宽,匹配了整个项目根目录;二是第三方库(比如你这里的matplotlib)的资源收集钩子误扫了当前工作目录下的文件,可按以下步骤修复:
1. 手动过滤收集的资源列表
这是最稳定的过滤方案,直接在spec文件的Analysis定义之后、PYZ定义之前添加过滤逻辑:
block_cipher = None a = Analysis(['..\\scripts\\scipt.py'], pathex=['C:\\Users\\..\\scripts'], binaries=[], datas=[...], hiddenimports=['pkg_resources.py2_warn'], hookspath=[], runtime_hooks=[], excludes=[], # 这里只保留需要排除的Python模块即可 win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) # ------------------- 新增过滤代码开始 ------------------- # 定义要排除的目录/关键词 exclude_patterns = ['.git', '__pycache__', 'dist', 'build', 'InnoSetup'] # 遍历所有待收集的资源,过滤掉匹配项 a.datas = [ data_item for data_item in a.datas if not any(pattern in data_item[0] for pattern in exclude_patterns) ] # ------------------- 新增过滤代码结束 ------------------- pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) # 后面的EXE、COLLECT配置保持不变即可
其中data_item[0]对应文件在最终dist目录里的相对路径,只要路径包含你要排除的关键词就会被过滤,你可以根据实际需求调整匹配规则。
2. 收窄datas配置规则
检查你当前datas参数里的配置,不要用('.', '.')这类匹配整个项目根目录的规则,只添加你实际需要用到的文件或目录:
datas=[ ('package/assets', 'assets'), # 仅添加需要的资源目录 ('config/config.yml', 'config') # 仅添加需要的单个配置文件 ],
3. 调整打包执行路径
尽量避免在项目根目录直接执行打包命令,可切换到specfiles目录下执行,减少误扫概率:
cd specfiles pyinstaller --onedir --noconfirm pyinstaller_specfile.spec --additional-hooks-dir=../hooks
内容的提问来源于stack exchange,提问作者Soerendip
相关产品推荐
相关产品推荐

