为何PyInstaller会替换文件目录?如何使用--add-data添加整个文件夹?
PyInstaller打包资源问题解决方案
1. 运行exe找不到资源文件的原因
- PyInstaller单文件(
-F参数)打包的exe启动时,会自动将所有依赖解压到系统临时目录下的随机命名_MEIxxxx文件夹,程序退出后该文件夹会被自动删除。你报错中出现的C:\Users\Dani\AppData\Local\Temp_MEI11962\就是这个临时目录。 - 你现有代码中用
this_dir()获取的是程序运行时的所在目录,exe运行时这个路径指向临时解压目录,而非exe本身存放的目录,所以会到临时目录找不存在的图片,触发报错。另外硬编码\\拼接路径的方式兼容性较差,推荐用Python内置路径拼接方法。
2. 使用--add-data添加整个文件夹的方法
--add-data参数的语法为:
- Windows系统:
--add-data "源路径;目标路径" - macOS/Linux系统:
--add-data "源路径:目标路径"
其中源路径是你本地要打包的文件夹路径,目标路径是资源解压后在临时目录中的相对路径。
比如要把项目目录下整个assets资源文件夹打包,Windows下打包命令示例:
pyinstaller -F test.py --add-data "assets/*;assets/"
3. 路径代码修复示例
你需要写兼容开发环境和打包后环境的路径获取逻辑,示例代码如下:
import sys import os def get_resource_path(relative_path): if getattr(sys, 'frozen', False): # 场景1:打包后运行,若资源和exe同目录,用下方这行 base_path = os.path.dirname(sys.executable) # 场景2:资源通过--add-data内嵌到exe中,用下方这行取临时目录路径 # base_path = sys._MEIPASS else: # 开发阶段直接取脚本所在目录 base_path = os.path.dirname(os.path.abspath(__file__)) return os.path.join(base_path, relative_path) # 调用示例,直接传入资源相对路径即可 img_path = get_resource_path("button_start.png")
内容的提问来源于stack exchange,提问作者Pixel
相关产品推荐
相关产品推荐

