PyInstaller打包Tkinter单文件应用后无法访问自定义backgrounds文件夹问题求助
故障原因
PyInstaller 单文件模式运行时,会将程序所有依赖解压到系统临时目录的随机子目录中,原有代码用os.path.abspath(__file__)获取到的是临时目录路径,而非 exe 程序实际所在目录,因此无法定位 backgrounds 文件夹。
修复方案
根据你的使用需求选对应方案即可:
方案1:backgrounds 文件夹放在 exe 同级目录(支持后续手动增减图片)
直接替换原有 APP_FOLDER 定义代码,兼容脚本运行和打包后运行两种场景:
import os import sys if getattr(sys, 'frozen', False): # 打包后运行场景:获取exe文件所在目录 APP_FOLDER = os.path.dirname(sys.executable) else: # 直接运行py脚本场景:获取脚本所在目录 APP_FOLDER = os.path.dirname(os.path.abspath(__file__))
打包后把 backgrounds 文件夹和生成的 exe 放在同一目录即可正常使用。
方案2:把 backgrounds 打包进 exe 内部(无需额外附带文件夹)
适合不需要后续修改背景图的场景,需要同时修改代码和打包命令:
- 替换
APP_FOLDER定义:
import os import sys if getattr(sys, 'frozen', False): # 打包后运行场景:获取PyInstaller临时解压目录 APP_FOLDER = sys._MEIPASS else: APP_FOLDER = os.path.dirname(os.path.abspath(__file__))
- 执行打包命令时添加资源打包参数:
- Windows 系统命令:
pyinstaller -F -w 你的脚本名称.py --add-data "backgrounds/*;backgrounds/" - macOS/Linux 系统命令:
pyinstaller -F -w 你的脚本名称.py --add-data "backgrounds/*:backgrounds/"
额外优化建议
原有代码直接用字符串拼接路径的写法存在跨平台兼容风险,建议改用os.path.join()拼接路径,例如:os.path.join(APP_FOLDER, 'backgrounds', file) 替换原有的 APP_FOLDER+'/backgrounds/'+file
内容的提问来源于stack exchange,提问作者Sonic Motion
相关产品推荐
相关产品推荐

