PyInstaller打包单目录EXE时图片资源找不到问题求助
解答
问题核心是:你调用图片时使用的相对路径是基于程序运行时的当前工作目录(CWD),而非main.exe所在目录。Windows下双击EXE启动时,默认CWD往往是用户数据目录(比如C:\Users\<用户名>\AppData\Roaming),而非打包后的EXE文件夹,所以直接用文件名会找不到图片。
PyInstaller的--add-data参数确实已经把图片复制到了EXE所在目录,但你的代码没有指向这个路径,而是去CWD查找,才导致官方方法看似失效。
解决步骤:
添加路径工具函数
在代码中加入一个兼容开发和打包模式的路径获取函数: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)修改图片调用逻辑
将原来直接使用文件名的代码,替换为调用上面的函数获取绝对路径:# 原代码:icon_image = PhotoImage(file = correspondance_table_icone[table]) # 修改后: icon_path = get_resource_path(correspondance_table_icone[table]) icon_image = PhotoImage(file=icon_path)确认PyInstaller参数有效性
你的--add-data参数配置正确:Windows下用;分隔源文件和目标目录,.表示将图片复制到EXE所在目录。打包完成后,图片会出现在main.exe的同级文件夹中,配合上面的路径函数就能正确加载。
为什么官方方法没直接生效?
官方文档中的--add-data仅负责将资源复制到指定的打包目录,不会自动修改你的代码路径逻辑。你必须自行处理运行时的路径问题,因为当前工作目录完全可能和EXE所在目录不一致(比如用户从命令行切换到其他目录运行EXE,或通过快捷方式指定了起始目录)。
额外提示
- 调试时可以打印
get_resource_path("bdd_trans.png")的结果,确认路径是否正确指向EXE所在目录下的图片文件。 - 单目录模式下,分发程序只需将整个打包文件夹复制给用户即可,所有资源都在同一目录,无需额外处理。
内容的提问来源于stack exchange,提问作者d'Elbreil Clément
相关产品推荐
相关产品推荐

