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

PyInstaller打包含pytesseract的单文件EXE:运行报错与打包警告排查

PyInstaller打包pytesseract单文件EXE问题解决

问题1:TypeError: Unsupported image object 报错原因及解决

核心原因

  • PyInstaller打包时未完整收集Pillow(PIL)的图像处理模块,导致运行时无法识别图像对象
  • 单文件模式下,临时解压的资源路径未正确配置,pytesseract无法读取图像
  • 代码中未使用Pillow规范加载图像(比如用了非PIL格式的图像对象)

解决步骤

  1. 规范图像加载代码:确保所有待识别图像通过PIL.Image.open()加载,示例代码:
from PIL import Image
import pytesseract
import sys
import os

# 适配打包后的路径
if hasattr(sys, '_MEIPASS'):
    pytesseract.pytesseract.tesseract_cmd = os.path.join(sys._MEIPASS, 'tesseract', 'tesseract.exe')
    os.environ['TESSDATA_PREFIX'] = os.path.join(sys._MEIPASS, 'tessdata')
else:
    # 开发环境路径
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
    os.environ['TESSDATA_PREFIX'] = r'C:\Program Files\Tesseract-OCR\tessdata'

# 正确加载图像并识别
img = Image.open('test_image.png')
ocr_result = pytesseract.image_to_string(img, lang='chi_sim')
print(ocr_result)
  1. 在spec文件中显式声明Pillow依赖:在hiddenimports中添加Pillow相关模块,避免PyInstaller遗漏。

问题2:打包警告(缺失libgcc_s_dw2-1.dll、无法获取非PE文件清单资源)

原因分析

  • libgcc_s_dw2-1.dll是MinGW编译环境的依赖库,PyInstaller未自动收集该文件
  • 非PE文件警告来自tessdata目录下的训练数据文件,这类文件本身不是可执行程序,无清单资源,属于正常提示

解决步骤

  1. 手动添加缺失的DLL:找到tesseract安装目录中的libgcc_s_dw2-1.dll(通常和tesseract.exe同目录),在spec文件的binaries中配置。
  2. 忽略非PE文件警告:该警告不影响程序运行,无需特殊处理,若需屏蔽可在打包时添加--warn-no-manifest参数。

正确的spec文件配置示例

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
    ['your_main_script.py'],
    pathex=['./'],
    # 打包tesseract.exe和缺失的DLL
    binaries=[
        ('C:/Program Files/Tesseract-OCR/tesseract.exe', 'tesseract'),
        ('C:/Program Files/Tesseract-OCR/libgcc_s_dw2-1.dll', '.')
    ],
    # 打包tessdata训练数据目录
    datas=[
        ('C:/Program Files/Tesseract-OCR/tessdata', 'tessdata')
    ],
    # 显式声明缺失的依赖模块
    hiddenimports=['pytesseract', 'PIL', 'PIL.Image', 'PIL.ImageOps'],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='OCR_Tool',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,  # 若为GUI程序则设为False
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

配置关键点说明

  • binaries:将tesseract的可执行文件和依赖DLL打包到EXE中,运行时会解压到临时目录的对应子文件夹
  • datas:完整打包tessdata目录,确保OCR能找到语言训练数据
  • hiddenimports:强制PyInstaller包含容易遗漏的Pillow和pytesseract模块

关于你的spec配置是否正确的结论

如果你的spec文件未包含上述binaries、datas的tesseract资源配置,也未在hiddenimports中声明Pillow相关模块,那么配置是不完整的。按照上述示例修正后,即可解决运行时的OCR报错和大部分打包警告。

内容的提问来源于stack exchange,提问作者Francisco Carmo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:13:21