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

PyInstaller打包单目录EXE时图片资源找不到问题求助

解答

问题核心是:你调用图片时使用的相对路径是基于程序运行时的当前工作目录(CWD),而非main.exe所在目录。Windows下双击EXE启动时,默认CWD往往是用户数据目录(比如C:\Users\<用户名>\AppData\Roaming),而非打包后的EXE文件夹,所以直接用文件名会找不到图片。

PyInstaller的--add-data参数确实已经把图片复制到了EXE所在目录,但你的代码没有指向这个路径,而是去CWD查找,才导致官方方法看似失效。

解决步骤:

  1. 添加路径工具函数
    在代码中加入一个兼容开发和打包模式的路径获取函数:

    import os
    import sys
    
    def get_resource_path(relative_path):
        # 打包后运行时,sys.executable指向EXE文件路径,取其所在目录
        if getattr(sys, 'frozen', False):
            base_path = os.path.dirname(sys.executable)
        # 开发模式下,取当前脚本的所在目录
        else:
            base_path = os.path.dirname(os.path.abspath(__file__))
        return os.path.join(base_path, relative_path)
    
  2. 修改图片调用逻辑
    将原来直接使用文件名的代码,替换为调用上面的函数获取绝对路径:

    # 原代码:icon_image = PhotoImage(file = correspondance_table_icone[table])
    # 修改后:
    icon_path = get_resource_path(correspondance_table_icone[table])
    icon_image = PhotoImage(file=icon_path)
    
  3. 确认PyInstaller参数有效性
    你的--add-data参数配置正确:Windows下用;分隔源文件和目标目录,.表示将图片复制到EXE所在目录。打包完成后,图片会出现在main.exe的同级文件夹中,配合上面的路径函数就能正确加载。

为什么官方方法没直接生效?

官方文档中的--add-data仅负责将资源复制到指定的打包目录,不会自动修改你的代码路径逻辑。你必须自行处理运行时的路径问题,因为当前工作目录完全可能和EXE所在目录不一致(比如用户从命令行切换到其他目录运行EXE,或通过快捷方式指定了起始目录)。

额外提示

  • 调试时可以打印get_resource_path("bdd_trans.png")的结果,确认路径是否正确指向EXE所在目录下的图片文件。
  • 单目录模式下,分发程序只需将整个打包文件夹复制给用户即可,所有资源都在同一目录,无需额外处理。

内容的提问来源于stack exchange,提问作者d'Elbreil Clément

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:15:53