Pyinstaller打包PyQt5和PaddleOCR项目实战经验分享

发布时间 2023-10-14 18:24:35作者: DuanYongchun

简介

先前做了一个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”目录下,以此类推。

执行打包命令:

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.大功告成。