You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:39:03