-
Notifications
You must be signed in to change notification settings - Fork 74
Open
Description
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
和派生路径。 - 参数名修正: 根据
paddleocr
和paddlex
类的实际__init__
参数列表(通过查看site-packages
中的源码),修正了PaddleOCR
和PPStructureV3
初始化时使用的参数名(例如,text_detection_model_dir
而非det_model_dir
;layout_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-python
等paddlex[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.datas
和a.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_hooks
、deps_patcher.py
、fix_paddle_libs.py
和 PPOCRLabel.spec
)均已整理至问题说明文件夹中,烦请协助排查,非常感谢!
Metadata
Metadata
Assignees
Labels
No labels