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

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"会找不到文件。

解决步骤

  1. 修改代码,获取正确的资源路径
    在代码中添加一个适配打包前后路径的函数,替换原有的图片加载路径:
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
  1. 验证PyInstaller命令
    确保--add-data参数格式正确,Windows下使用分号分隔源路径和目标路径,路径包含特殊字符时用双引号包裹(原命令格式已符合要求):
pyinstaller --noconfirm --onefile --windowed --add-data "C:/Users/Murad/PycharmProjects/Sia'sTroll/BSOD.png;." main.py
  1. 重新打包测试
    删除之前生成的build、dist目录和.spec文件,重新执行打包命令,运行生成的exe文件即可正常加载图片。

内容的提问来源于stack exchange,提问作者Murad Bunyatov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:40:02