当你使用 PyInstaller 编译 Python 脚本成一个独立的 Windows 可执行文件(exe)时,资源文件(如图片)的处理需要一些额外的考虑。下面解释了如何将图片资源编译到 exe 文件中,以及在不同场景下的处理方法。

方法 1:将图片资源编译到 exe 文件中

使用 PyInstaller 的 --add-data 参数

你可以使用 --add-data 参数将图片文件作为资源添加到你的 exe 文件中。这样做,图片会被嵌入到exe文件中,方便分布。

示例命令:

bash

pyinstaller -F -w --add-data "btn_screenshot.png;." your_automatic_script.py
  • --add-data "btn_screenshot.png;." :

    • btn_screenshot.png 是你要添加的图片文件名。

    • ;. 表示图片文件应该被放在exe文件的当前工作目录中。这意味着在运行时,图片会被临时解压到exe运行目录中。

在脚本中访问嵌入的图片 resource

由于图片被嵌入到exe中,你不能再使用原来的文件路径来访问它。PyInstaller 提供了 sys._MEIPASS 变量来访问临时解压目录。下面是修改后的脚本片段:

python

import sys
import os
import cv2
import pyautogui

# 获取临时资源路径(仅在 frozen 状态下有效)
def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath('.'), relative_path)

# 加载图片
btn_img_path = resource_path('btn_screenshot.png')
btn_img = cv2.imread(btn_img_path)

方法 2:将图片文件与 exe 一起分发

不嵌入图片,单独分发

如果你不想将图片嵌入到exe文件中,可以选择将其作为一个单独的文件与exe一起分发。这样,你需要确保exe文件和图片文件始终在相同的目录中。

编译命令(无变化):

bash

pyinstaller -F -w your_automatic_script.py

脚本保持不变

在这种情况下,你的脚本中加载图片的代码保持不变,因为图片文件与exe文件位于同一目录:

python

btn_img = cv2.imread('btn_screenshot.png')

分发时,确保两个文件一起复制

当你分发exe文件时,别忘了将 btn_screenshot.png 一起复制到相同的目录。

总结

  • 嵌入资源:使用 --add-data 参数将图片嵌入到exe中,修改脚本使用 sys._MEIPASS 访问资源。优点: 方便分发,缺点: 增加exe大小。

  • 单独分发:保持脚本不变,确保图片与exe在同一目录。优点: exe大小不变,缺点: 分发时需要确保文件一起复制。