首页 > 其他分享 >Pyinstaller打包PyQt5和PaddleOCR项目实战经验分享

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

时间:2023-10-14 18:34:31浏览次数:45  
标签:ch Pyinstaller whl PaddleOCR py PyQt5 paddleocr infer cls

简介

先前做了一个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.大功告成。

 

标签:ch,Pyinstaller,whl,PaddleOCR,py,PyQt5,paddleocr,infer,cls
From: https://www.cnblogs.com/dyc99/p/17764494.html

相关文章

  • PyQT5 PyQT入门教程(之三)
    REFhttp://code.py40.com/pyqt5/22.html 事件Event所有的GUI程序都是事件驱动的。事件主要由用户触发,但也可能有其他触发方式:例如网络连接、windowmanager或定时器。当我们调用QApplication的exec_()方法时会使程序进入主循环。主循环会获取并分发事件。在事件模型中,有三个参与......
  • PyQT5 PyQT入门教程(之二)
    REFhttps://www.jianshu.com/p/3832eb48f3d5 布局(Layout)管理QtDesigner中,在工具箱中最上方可以看到有4种布局。分别是垂直布局、水平布局、栅格布局和表单布局。  四种布局布局名称   布局含义垂直(Vertical)布局   布局内的控件按照从上到下的顺序纵向排列水平(Horizon......
  • PyQT5 PyQT入门教程(之一)
    REFhttps://www.jianshu.com/p/5b063c5745d0 本篇博客对应的视频讲解:https://www.bilibili.com/video/BV1NZ4y1Z7ue/ QtDesigner的介绍在PyQt中编写UI界面可以直接通过代码来实现,也可以通过QtDesigner来完成。QtDesigner的设计符合MVC的架构,其实现了视图和逻辑的分离,从而实现......
  • 『PyQt5-Qt Designer篇』| 08 Qt Designer中容器布局和绝对布局的使用
    (08QtDesigner中容器布局和绝对布局的使用)1容器布局1.1设计容器布局先拖入一个容器Frame容器,然后拖入几个控件:把拖入的控件拖入容器中:选中容器,右键-布局-栅格布局:1.2保存文件并执行保存为test007_ConFra.ui,并生成test007_ConFra.py:#-*-coding:utf-8-*-#......
  • 正确安装PaddleOCR的方法
     paddleocr安装起来太费劲了pipinstallpatch-ngpipinstallpaddleocr --use-pep517  (失败)1.首先去github下载:https://github.com/PaddlePaddle/PaddleOCR,然后找个文件夹解压。(从CSDN中点开链接时会提供加速功能,跳转到了https://gitcode.net/mirrors/paddlepaddle/padd......
  • PaddleOCR安装过程中的ERROR
    PaddleOCR安装过程中的ERROROSError:(External)CUDAerror(222),theprovidedPTXwascompiledwithanunsupportedtoolchain..[Hint:'cudaErrorUnsupportedPtxVersion'.ThisindicatesthattheprovidedPTXwascompiledwithanunsupportedtoolchain.Th......
  • 【AI测试】已落地-python文字图像识别PaddleOCR
    python文字图像识别PaddleOCRPaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地。国产之光,百度开源的paddleocr开源地址:https://github.com/PaddlePaddle/PaddleOCR官方电子书:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7......
  • Use Pyinstaller To Creat EXE
    UsePyinstallerToCreatEXECreatNewFolderPutfileintoNewFoderfile:py、icoOpenpowershellInputCommandPyinstaller-F-w-i="replace.ico"source.py-F,--onefile Createaone-filebundledexecutable.-D,--onedir......
  • pyqt5-QSplitter分裂器组件
    1、介绍QSplitter,分裂器组件。用于水平或垂直方向上布局管理,可以拖动其内某一方向上的分隔线,改变各组件在该方向上的尺寸分配。QSplitter(parent:typing.Optional[QWidget]=None)QSplitter(orientation:Qt.Orientation,parent:typing.Optional[QWidget]=None)2、子组......
  • pyqt5-QAbstractButton抽象按钮类
    1、介绍QAbstractButton,抽象按钮类。该类定义了按钮类型组件的常用方法和事件,是QPushButton按钮组件、QCheckBox多选按钮组件、QRadioButton单选按钮组件的直接父类。另一方面,该类直接继承QWidget类。2、基础使用setText(self,text:str)设置文本text(self)->str获取......