PyInstaller编译后PIL无法加载BSOD.png文件的问题求助
PyInstaller打包后PIL无法找到BSOD.png文件的解决方案
问题重现
打包恶搞程序后运行exe,出现以下报错:
Traceback (most recent call last): File "main.py", line 18, in <module> File "PIL\Image.py", line 3247, in open FileNotFoundError: [Errno 2] No such file or directory: "C:\\Users\\Murad\\PycharmProjects\\Sia'sTroll\\dist\\BSOD.png"
使用的PyInstaller命令:
pyinstaller --noconfirm --onefile --windowed --add-data "C:/Users/Murad/PycharmProjects/Sia'sTroll/BSOD.png;." main.py
已尝试使用绝对路径、Auto Py to Exe,问题仍未解决。
核心原因
使用--onefile模式打包时,PyInstaller会将所有资源和代码压缩成单个exe文件,运行时会自动解压到系统临时目录(而非exe所在的dist目录),代码中直接使用相对路径"BSOD.png"会找不到文件。
解决步骤
- 修改代码,获取正确的资源路径
在代码中添加一个适配打包前后路径的函数,替换原有的图片加载路径:
from PIL import Image as PILImage from tkinter import * import keyboard import datetime import win32api import random import mouse import os import sys def get_resource_path(relative_path): # 获取打包后资源的实际路径 try: base_path = sys._MEIPASS # PyInstaller打包后生成的临时目录 except Exception: base_path = os.path.abspath(".") # 未打包时的当前工作目录 return os.path.join(base_path, relative_path) TimeList = ["1300", "1210", "1125", "1040", "0945"] ChosenTime = TimeList[random.randint(0, 4)] User = os.getlogin() ScreenWidth = win32api.GetSystemMetrics(0) ScreenHeight = win32api.GetSystemMetrics(1) # 使用获取到的正确路径加载图片 BSOD = PILImage.open(get_resource_path("BSOD.png")) BSOD.thumbnail((ScreenWidth, ScreenHeight)) BSOD.save(fr"C:\Users\{User}\Documents\BSODTrueSize.png") def CallBSOD(): Root = Tk() Root.attributes("-topmost", True) Root.attributes("-fullscreen", True) BSODPhotoImage = PhotoImage(file=fr"C:\Users\{User}\Documents\BSODTrueSize.png") BSODLabeledImage = Label(image=BSODPhotoImage) BSODLabeledImage.pack() Root.after(random.randint(15, 60) * 1000, lambda: Root.destroy()) Root.mainloop() CallBSOD() # while True: # CurrentTime = str(datetime.datetime.now().strftime("%H%M")) # if CurrentTime == ChosenTime: # CallBSOD() # break
- 验证PyInstaller命令
确保--add-data参数格式正确,Windows下使用分号分隔源路径和目标路径,路径包含特殊字符时用双引号包裹(原命令格式已符合要求):
pyinstaller --noconfirm --onefile --windowed --add-data "C:/Users/Murad/PycharmProjects/Sia'sTroll/BSOD.png;." main.py
- 重新打包测试
删除之前生成的build、dist目录和.spec文件,重新执行打包命令,运行生成的exe文件即可正常加载图片。
内容的提问来源于stack exchange,提问作者Murad Bunyatov
相关产品推荐
相关产品推荐

