PyInstaller打包含pytesseract的单文件EXE:运行报错与打包警告排查
PyInstaller打包pytesseract单文件EXE问题解决
问题1:TypeError: Unsupported image object 报错原因及解决
核心原因
- PyInstaller打包时未完整收集Pillow(PIL)的图像处理模块,导致运行时无法识别图像对象
- 单文件模式下,临时解压的资源路径未正确配置,pytesseract无法读取图像
- 代码中未使用Pillow规范加载图像(比如用了非PIL格式的图像对象)
解决步骤
- 规范图像加载代码:确保所有待识别图像通过
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)
- 在spec文件中显式声明Pillow依赖:在
hiddenimports中添加Pillow相关模块,避免PyInstaller遗漏。
问题2:打包警告(缺失libgcc_s_dw2-1.dll、无法获取非PE文件清单资源)
原因分析
libgcc_s_dw2-1.dll是MinGW编译环境的依赖库,PyInstaller未自动收集该文件- 非PE文件警告来自
tessdata目录下的训练数据文件,这类文件本身不是可执行程序,无清单资源,属于正常提示
解决步骤
- 手动添加缺失的DLL:找到tesseract安装目录中的
libgcc_s_dw2-1.dll(通常和tesseract.exe同目录),在spec文件的binaries中配置。 - 忽略非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
相关产品推荐
相关产品推荐

