Skip to content

[Bug] PyInstaller 打包后运行报错:The pipeline (OCR) does not exist #201

@WU-YACONG

Description

@WU-YACONG

PyInstaller 打包 PPOCRLabel 项目失败问题说明

  • 目标: 将 PPOCRLabel 打包成 Windows 可执行文件(.exe),以便在没有 Python 环境的机器上运行。
  • 开发环境: Windows 系统,使用 Conda 管理的 Python 环境,Python 版本 3.11。
  • 主要依赖库: paddleocr (版本可能为 2.x/3.x), paddlex (版本可能为 2.x/3.x), PyQt5, paddlepaddle 等。
  • 项目结构: 包含 PPOCRLabel.py 主脚本,以及 local_models, data, resources, libs 等子目录。

1. 问题概述

程序在 Conda 环境中通过 python PPOCRLabel.py --lang ch 命令可以正常运行,且所有模型(包括 OCR 核心模型和 PPStructureV3 相关模型)都已成功修改代码,从本地 local_models 目录加载,不再自动下载

然而,在使用 PyInstaller 打包时,尝试了各种方案均告失败。

2. PyInstaller 打包尝试及遇到的问题

初始打包命令 (参考官方文档):

PowerShell

pyinstaller --clean -D -w `
    PPOCRLabel.py `
    --collect-all paddleocr `
    --collect-all pyclipper `
    --collect-all imghdr `
    --collect-all skimage `
    --collect-all imgaug `
    --collect-all scipy.io `
    --collect-all lmdb `
    --collect-all paddle `
    --hidden-import=pyqt5 `
    -p ./libs `
    -p ./ `
    -p ./data `
    -p ./resources `
    -F # 或 -D

遇到的核心错误(反复出现):

Exception: The pipeline (OCR) does not exist! Please use a pipeline name or a config file path!

错误栈(示例,始终指向 paddlex 内部的 pipeline 加载):

Traceback (most recent call last):
  File "PPOCRLabel.py", line XXXX, in <module>
  File "PPOCRLabel.py", line XXXX, in main
  File "PPOCRLabel.py", line XXXX, in get_main_app
  File "PPOCRLabel.py", line XXXX, in __init__
  File "paddleocr\_pipelines\ocr.py", line XXXX, in __init__
  File "paddleocr\_pipelines\base.py", line XXXX, in __init__
  File "paddleocr\_pipelines\base.py", line XXXX, in _get_merged_paddlex_config
  File "paddlex\inference\pipelines\__init__.py", line 95, in load_pipeline_config
Exception: The pipeline (OCR) does not exist! Please use a pipeline name or a config file path!

其他辅助错误/警告:

  • PyInstaller 编译时的 WARNING: Hidden import ... not found! 例如 sip, scipy.special._cdflib, pysqlite2, MySQLdb 等。这些警告在 .exe 最终运行失败时,尚未确定是直接原因。

3. 针对问题的已尝试解决方案

3.1 核心代码修改:

  • 模型加载路径修改: 已修改 PPOCRLabel.py,确保所有 PaddleOCR/PPStructureV3 模型(包括检测、识别、分类、版面、表格等)都明确从本地 local_models 目录加载,而不是自动下载。已将 __init__modelChoose 中的模型加载逻辑调整为使用统一的实例变量 self._models_base_path 和派生路径。
  • 参数名修正: 根据 paddleocrpaddlex 类的实际 __init__ 参数列表(通过查看 site-packages 中的源码),修正了 PaddleOCRPPStructureV3 初始化时使用的参数名(例如,text_detection_model_dir 而非 det_model_dirlayout_detection_model_dir 等)。

3.2 PyInstaller 打包参数尝试:

  • —add-data 包含资源:
    • paddlex/.version 文件:--add-data "F:\anaconda3\envs\paddle\Lib\site-packages\paddlex\.version;paddex"
    • 本地模型:--add-data "I:\BaiduSyncdisk\ocr-test\PPOCRLabel\local_models;local_models"
    • 项目资源:--add-data "I:\BaiduSyncdisk\ocr-test\PPOCRLabel\data;data"—add-data "I:\BaiduSyncdisk\ocr-test\PPOCRLabel\resources;resources"
  • —collect-all 增强:
    • --collect-all paddleocr
    • --collect-all paddlex (已显式添加)
    • 以及 pyclipper, imghdr, skimage, imgaug, scipy.io, lmdb, paddle 等。
  • —hidden-import 显式导入:
    • --hidden-import=pyqt5
    • --hidden-import=paddlex.version
    • 尝试添加了 shapely, lxml, opencv-pythonpaddlex[ocr] 依赖。
  • 模式尝试: 尝试了 -F (单文件) 和 -D (单文件夹) 模式。目前主要集中在 -D 模式以提高稳定性。

3.3 自定义 PyInstaller Hook 文件:

  • 创建 pyinstaller_hooks/hook-paddlex.py 尝试编写自定义 hook 文件,使用 collect_data_files 来强制包含 paddlex/inference 整个目录(包括 pipelines, models, common 等),并添加额外的 hiddenimports
  • 在打包命令中引用 Hook: --additional-hooks-dir "I:\BaiduSyncdisk\ocr-test\PPOCRLabel\pyinstaller_hooks"

3.4 .spec 文件打包:

  • 已尝试生成 .spec 文件,并手动编辑 a.datasa.hiddenimports 列表,将所有 —add-data—hidden-import 的参数整合到 .spec 文件中,并通过 hookspath 引用自定义 hook。
  • 甚至尝试了在 a.datas 中直接包含整个 paddlex 包:('F:/anaconda3/envs/paddle/Lib/site-packages/paddlex', 'paddlex'),以确保所有内部资源都被复制。

4. 问题总结

尽管 PyInstaller 编译过程显示 Build complete!,但运行生成的 PPOCRLabel.exe 仍然抛出 Exception: The pipeline (OCR) does not exist!

编译过程中使用的配置文件( pyinstaller_hooksdeps_patcher.pyfix_paddle_libs.pyPPOCRLabel.spec)均已整理至问题说明文件夹中,烦请协助排查,非常感谢!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions