PyInstaller Tree路径找不到报错:如何打包etc文件夹及内容?
PyInstaller打包时无法定位etc文件夹的解决方法
问题情况
需要将项目根目录下的etc文件夹(含内部sbom.json文件)打包进PyInstaller生成的可执行文件,采用Tree方法配置spec文件后,执行pyinstaller fetch_sbom_packages.spec时触发错误:The system cannot find the path specified: '..\etc。
项目依赖说明:fetch_sbom_packages.py依赖同目录下的dsapi.py和shared.py,文件夹结构如下:
原spec文件内容:
# -*- mode: python ; coding: utf-8 -*- a = Analysis( ['fetch_sbom_packages.py'], pathex=[], binaries=[], datas=[], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, a.binaries, Tree('..\etc', prefix='etc\'), a.datas, [], name='fetch_sbom_packages', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, )
问题原因
- 路径转义错误:Python字符串中的反斜杠是转义字符,
'..\etc'中的\e会被解析为转义序列,导致实际路径识别错误。 - Tree放置位置错误:Tree资源未添加到
Analysis的datas列表中,而是直接放入EXE参数,PyInstaller无法正确收集该资源。 - 工作目录不匹配:若执行
pyinstaller时不在spec文件所在的scripts目录,相对路径..\etc会指向错误的位置。
修复步骤
- 修正路径转义:使用Python原始字符串(前缀
r)或双反斜杠表示路径,避免转义问题;同时prefix参数无需以反斜杠结尾,直接写etc即可。 - 调整Tree位置:将Tree添加到
Analysis的datas列表中,让PyInstaller统一处理资源收集。 - 确认工作目录:执行打包命令前,确保当前终端处于
scripts目录下(即spec文件所在目录)。
修改后的spec文件
# -*- mode: python ; coding: utf-8 -*- a = Analysis( ['fetch_sbom_packages.py'], pathex=[], binaries=[], # 将Tree添加到datas,使用原始字符串避免路径转义 datas=[Tree(r'..\etc', prefix='etc')], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, a.binaries, a.datas, # 直接引用已包含Tree的a.datas [], name='fetch_sbom_packages', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, )
验证方法
打开终端,切换到scripts目录,执行命令:
pyinstaller fetch_sbom_packages.spec
打包完成后,可在dist/fetch_sbom_packages目录下找到包含etc文件夹的可执行文件。
内容的提问来源于stack exchange,提问作者nikhil
相关产品推荐
相关产品推荐

