Pyinstaller打包PyQt5和PaddleOCR项目实战经验分享
简介
先前做了一个PyQt5和PaddleOCR结合的项目,但在使用Pyinstaller打包时却踩了很多坑,因此分享一下,以便后人乘凉。(Pycharm)
1.项目涉及图片或者文件等依赖
(1)图片依赖
第一步:创建一个resources.qrc文件;
第二步:将resources.qrc文件转换为.py文件,具体转换过程不赘述;
第三步:在使用到图片的文件中导入resources_rc.py并修改图片引用代码;
import resources_rc # splash = QSplashScreen(QPixmap("./images/search.png")) # 先前引用方式 splash = QSplashScreen(QPixmap(":/images/search.png")) # 现在引用方式
(2)文件依赖
打包命令如下:
Pyinstaller main.py
执行上述命令后会在项目文件夹下生成dist、build两个文件夹以及main.spec文件,解决文件依赖问题必须配置好main.spec文件;
在此项目中由于需要在打包之后离线使用PaddleOCR,因此还需打包PaddleOCR的权重模型的文件(此处权重文件夹是我复制到此处的,一般存储在C:\Users\10167\.paddleocr),另外还需有utils包中的其他.py文件;
下附mian.spec配置:
# -*- mode: python ; coding: utf-8 -*- a = Analysis( ['main.py', 'utils/config_manager.py', 'utils/database_manager.py', 'utils/ocr_manager.py', 'utils/platform_manager.py', 'utils/sensitive_manager.py', 'utils/systemIcon_manager.py', 'utils/traverse_manager.py', 'utils/ui_manager.py',], pathex=['E:\\Users\\10167\\anaconda3\\envs\\PeintreAmy\\Lib\\site-packages\\paddleocr', 'E:\\Users\\10167\\anaconda3\\envs\\PeintreAmy\\Lib\\site-packages\\paddle\\libs'], binaries=[('E:\\Users\\10167\\anaconda3\\envs\\PeintreAmy\\Lib\\site-packages\\paddle\\libs', '.'), ('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\cls\\ch_ppocr_mobile_v2.0_cls_infer\\inference.pdiparams', '.paddleocr\\whl\\cls\\ch_ppocr_mobile_v2.0_cls_infer'), ('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\cls\\ch_ppocr_mobile_v2.0_cls_infer\\inference.pdiparams.info', '.paddleocr\\whl\\cls\\ch_ppocr_mobile_v2.0_cls_infer'), ('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\cls\\ch_ppocr_mobile_v2.0_cls_infer\\inference.pdmodel', '.paddleocr\\whl\\cls\\ch_ppocr_mobile_v2.0_cls_infer'), ('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\det\\ch\\ch_PP-OCRv3_det_infer\\inference.pdiparams', '.paddleocr\\whl\\det\\ch\\ch_PP-OCRv3_det_infer'), ('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\det\\ch\\ch_PP-OCRv3_det_infer\\inference.pdiparams.info', '.paddleocr\\whl\\det\\ch\\ch_PP-OCRv3_det_infer'), ('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\det\\ch\\ch_PP-OCRv3_det_infer\\inference.pdmodel', '.paddleocr\\whl\\det\\ch\\ch_PP-OCRv3_det_infer'), ('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\rec\\ch\\ch_PP-OCRv3_rec_infer\\inference.pdiparams', '.paddleocr\\whl\\rec\\ch\\ch_PP-OCRv3_rec_infer'), ('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\rec\\ch\\ch_PP-OCRv3_rec_infer\\inference.pdiparams.info', '.paddleocr\\whl\\rec\\ch\\ch_PP-OCRv3_rec_infer'), ('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\rec\\ch\\ch_PP-OCRv3_rec_infer\\inference.pdmodel', '.paddleocr\\whl\\rec\\ch\\ch_PP-OCRv3_rec_infer'), ], datas=[], hiddenimports=[], hookspath=['.'], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name='main', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, icon=['search.ico'], ) coll = COLLECT( exe, a.binaries, a.datas, strip=False, upx=True, upx_exclude=[], name='main', )
其中,
('D:\\CNCB\\FastFind\\PeintreAmy\\.paddleocr\\whl\\cls\\ch_ppocr_mobile_v2.0_cls_infer\\inference.pdiparams', '.paddleocr\\whl\\cls\\ch_ppocr_mobile_v2.0_cls_infer'),
表示将“inference.pdiparams”文件打包到“.paddleocr\\whl\\cls\\ch_ppocr_mobile_v2.0_cls_infer”目录下,以此类推。此文件为PaddleOCR的权重文件目录结构如下:
执行打包命令:
pyinstaller main.spec
打包完成后会在_internal下产生一个.paddleocr的文件夹;
上述main.spec中涉及PaddleOCR引用的部分代码如下,路径必须写对不然程序找不到路径:
2.打包完成后配置
(1)ppocr配置
将PaddleOCR安装路径中的ppocr文件夹复制到dist/main/_internal文件夹下:
(2)其他配置
其他问题一般都是路径引用的问题,对症下药即可,最难的问题已经解决了。如果想查错,则将main.spec文件中的console属性值设置为True,打包完成后进入包含main.exe文件的路径,在cmd窗口中输入main.exe执行即可在cmd窗口看到错误。
3.大功告成。