PyInstaller打包含Tesseract的exe时,临时目录PDF生成失败求助
解决PyInstaller打包pytesseract.image_to_pdf_or_hocr生成PDF失败的问题
核心问题分析
直接运行代码正常,但打包为exe后无法生成临时PDF,本质是打包后的Tesseract环境配置不完整或临时目录权限/路径匹配异常,导致tesseract.exe无法正常生成输出文件,进而触发FileNotFoundError。
具体解决方案
1. 强制指定打包后Tesseract的执行路径
PyInstaller会将spec中配置的文件释放到临时目录(通过sys._MEIPASS访问),但pytesseract默认会从系统PATH查找tesseract.exe,必须手动指定路径:
import sys import os import pytesseract # 获取Tesseract的实际路径 def get_tesseract_executable(): if hasattr(sys, '_MEIPASS'): # 打包后:临时释放目录下的TESSEERACT-OCR文件夹(注意spec中的拼写是TESSEERACT,多一个E) return os.path.join(sys._MEIPASS, 'TESSEERACT-OCR', 'tesseract.exe') else: # 开发环境:本地Tesseract路径 return r'你的本地Tesseract路径\tesseract.exe' # 覆盖pytesseract的默认路径 pytesseract.pytesseract.tesseract_cmd = get_tesseract_executable()
注意:必须和spec文件中配置的Tesseract文件夹名称完全一致(你的spec里写的是TESSEERACT-OCR,不是TESSERACT-OCR,别写错)。
2. 修复Tesseract文件的打包规则
你的spec文件中仅打包了Tesseract根目录的*.*和部分子目录,可能遗漏了关键依赖(如bin目录下的DLL文件),修改binaries配置为递归匹配所有文件:
binaries=[ # 其他poppler配置保持不变 ('Source/TESSEERACT-OCR/**/*', 'TESSEERACT-OCR'), # 递归打包所有子目录文件 ],
这样能确保所有Tesseract依赖的DLL、配置文件都被正确打包并释放。
3. 确保临时目录可写入
部分杀毒软件或系统权限会限制exe写入默认临时目录,可手动指定自定义临时目录并设置环境变量:
import tempfile import os # 创建可写的临时目录 custom_temp_dir = tempfile.mkdtemp() # 让tesseract使用这个目录生成临时文件 os.environ['TMP'] = custom_temp_dir os.environ['TEMP'] = custom_temp_dir
同时检查默认临时目录C:\Users\PAVANS~1\AppData\Local\Temp的写入权限,确保当前用户拥有读写权限。
4. 调试Tesseract的执行命令
添加调试代码,打印tesseract的执行命令和输出,定位具体错误:
from pytesseract.pytesseract import build_tesseract_cmd import subprocess # 构造测试命令(替换为你的实际图片路径) test_image = 'test.png' cmd = build_tesseract_cmd(test_image, 'output_temp', extension='pdf') print(f"Tesseract执行命令: {cmd}") # 手动执行命令并捕获输出 result = subprocess.run(cmd, capture_output=True, text=True) print(f"标准输出: {result.stdout}") print(f"错误输出: {result.stderr}")
打包后运行exe,查看控制台输出,若tesseract报错“找不到依赖DLL”,说明打包时遗漏了文件;若报错“权限不足”,则需要调整临时目录权限。
内容的提问来源于stack exchange,提问作者Pavan Sai
相关产品推荐
相关产品推荐

