0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PyQT5+OpenCV开发的应用如何打包发布?

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-10-25 09:40 次阅读

打包工具选择

我自己用PyQT5写了一个应用程序,基本上都写好了,到了打包发布这个环节,我知道的有两个工具可以帮我打包分别是

Pyinstaller
Cython
pyinstaller会给我打包成一个exe文件,把python解释器、所有依赖包、各种DLL都打包在里面,然后最终出来一个exe文件,听上去是很好。 Cython会给打包成pyd文件,然后依靠包导入的方式完成启动,不会生成exe文件,听上去没有pyinstaller好 两个工具的安装都十分方便快捷:
pip install pyinstaller
pip install Cython
这两个我都测试了,最终我选择用Cython完成了打包发布。为什么不用pyinstaller,打包出来的exe文件比较大,然后各种命令行操作我也不太熟悉,已经学废了。然后打包完成之后各种DLL无法load跟找不到,时间不等人啊!最重要的,pyinstaller打包完成exe其实就是一个压缩包,特别容易被反编译跟逆向工程取得源码!谁让我已经用过这招,所以我猜别人也会用。 选择Cython是转C然后编译生成的,想要逆向是十分困难,源码保护会好点,另外Cython打包只要一个脚本运行一下就好啦,这个脚本还是我从网上的来的,感谢这个脚本作者!脚本随便改了改,就可以直接使用了。

打包流程与目录结构

在开始打包之前,先把一些非源码的文件整理好,放在项目的资源文件夹下面,我有两个资源文件夹分别是images跟models,它们就不用打包了。然后我把我的五个源码文件夹

4c9391a0-5392-11ed-a3b6-dac502259ad0.png

以dlcore为例,修改脚本,运行package_installer,脚本我也贴出来,有需求的自取,放到跟项目同层目录下面,会自动创建build文件夹的。

importsys,os,shutil,time
fromdistutils.coreimportsetup
fromCython.Buildimportcythonize

start_time=time.time()
curr_dir=os.path.abspath('.')
parent_path=sys.argv[1]iflen(sys.argv)>1else""
setup_file=__file__.replace('/','\')
build_dir="build"
build_tmp_dir=build_dir+"/temp"

s="#cython:language_level=3"


defget_py(base_path=os.path.abspath('.'),parent_path='',name='ui',excepts=(),copyOther=False,delC=False):
"""
获取py文件的路径
:parambase_path:根路径
:paramparent_path:父路径
:paramexcepts:排除文件
py文件的迭代器
"""
full_path=os.path.join(base_path,parent_path,name)
forfilenameinos.listdir(full_path):
full_filename=os.path.join(full_path,filename)
ifos.path.isdir(full_filename)andfilename!=build_dirandnotfilename.startswith('.'):
forfinget_py(base_path,os.path.join(parent_path,name),filename,excepts,copyOther,delC):
yieldf
elifos.path.isfile(full_filename):
ext=os.path.splitext(filename)[1]
ifext==".c":
ifdelCandos.stat(full_filename).st_mtime>start_time:
os.remove(full_filename)
eliffull_filenamenotinexceptsandos.path.splitext(filename)[1]notin('.pyc','.pyx'):
ifos.path.splitext(filename)[1]in('.py','.pyx')andnotfilename.startswith('__'):
path=os.path.join(parent_path,name,filename)
yieldpath
else:
pass


defpack_pyd():
#获取py列表
module_list=list(get_py(base_path=curr_dir,parent_path=parent_path,excepts=(setup_file,)))
try:
setup(
ext_modules=cythonize(module_list,compiler_directives={'language_level':"3"}),
script_args=["build_ext","-b",build_dir,"-t",build_tmp_dir],
)
exceptExceptionasex:
print("error!",str(ex))
else:
module_list=list(get_py(base_path=curr_dir,parent_path=parent_path,excepts=(setup_file,),copyOther=True))

module_list=list(get_py(base_path=curr_dir,parent_path=parent_path,excepts=(setup_file,),delC=True))
ifos.path.exists(build_tmp_dir):
shutil.rmtree(build_tmp_dir)

print("complate!time:",time.time()-start_time,'s')


defdelete_c(path='.',excepts=(setup_file,)):
'''
删除编译过程中生成的.c文件
:parampath:
:paramexcepts:

'''
dirs=os.listdir(path)
fordirindirs:
new_dir=os.path.join(path,dir)
ifos.path.isfile(new_dir):
ext=os.path.splitext(new_dir)[1]
ifext=='.c':
os.remove(new_dir)
elifos.path.isdir(new_dir):
delete_c(new_dir)


if__name__=='__main__':
try:
pack_pyd()
exceptExceptionase:
print(str(e))
finally:
delete_c()
最终build文件夹中生成对应的pyd文件如下:

4cdfd5d8-5392-11ed-a3b6-dac502259ad0.png

运行完这些源码文件夹把得到pyd文件分别拷贝到另外一个目录下对应文件夹中,最终我的打包好的目录结构如下:

4e0ab554-5392-11ed-a3b6-dac502259ad0.png

其中requirements.txt里面是需要安装第三方依赖库,在该目录运行命令行即可完成安装:

pip install -r requirements.txt
参考readme文件,可以完成OpenVINO2022、TensorRT8.x配置支持。 我手写了一个简单startup.bat文件,双击startup.bat即可运行打包好的应用!
@echo "try to run openvm"
SET PYTHONPATH=.%PYTHONPATH%
cd ui
python application_ui.py

运行截图如下:

4e1bdd84-5392-11ed-a3b6-dac502259ad0.png

遇到的坑

最后说一下,我用cython打包遇到的一个大坑:

4e471ecc-5392-11ed-a3b6-dac502259ad0.png

我有个超类ImageTask,然后里面定义几个抽象方法,其中一个方法名是exec,谁知道这个是cython无法解析的字符串,我猜可能因为代码安全检测无法通过,所以一直给报截图的错误,后面我把这个方法名称从exec改成t_exec就可以把对应的py文件转pyd文件了。

使用pyinstaller打包时候会遇到

Error: geos_c.dll not found, required by hook-shapely.py

下载geos_c.dll https://www.dll-files.com/geos_c.dll.html

然后扔到windows/system32里面去就好啦!

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40770
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83466
  • pyqt5
    +关注

    关注

    0

    文章

    25

    浏览量

    3361

原文标题:PyQT5+OpenCV开发的应用如何打包发布?

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    可视可交互!H618上用OpenCV读取图像显示到PyQt5窗口上

    这里分享一个代码,功能是使用图像处理库opencv从摄像头获取数据,缩放后从pyqt5的窗口中显示出来。安装opencvsudo pip3 install opencv-python创建一个
    发表于 01-10 09:55

    PyQt

    。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。 PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt
    发表于 04-14 10:26

    求助工具里的网页发布打包问题

    小编遇到现在将程序打包成安装包以后,其安装以后工具选项里没有网页发布工具,怎么将网页发布功能打包进安装程序?求各路大神告知
    发表于 08-31 09:35

    【Firefly RK3399试用体验】第二篇:PyQt5大战点灯

    ,使用命令apt install python3-pyqt5Ubuntu里也提供了一些IDE开发工具如IDLE、Spyder等等,此处不详细介绍它们安装过程。之后我们开始编写Pyqt5点灯,需要的前提
    发表于 06-12 07:49

    【Firefly RK3399试用体验】PyQt5信号检测系统(结项)

    是RK3399上PyQt显示的内部通道波形的FFT由于手里没有信号源等啥设备,只好用直流电压进行测试,channel0,如下所示接下来重点阐述PyQt5部分设计,PyQt5部分涉及到网口通信部分我
    发表于 07-13 12:55

    ModuleNotFoundError No module named 'PyQt5sip'的解决方法

    成功解决 ModuleNotFoundError No module named 'PyQt5sip'
    发表于 12-25 17:22

    OpenCV学习之路--5--OpenCV3.4.10的ARM版本移植到开发板 精选资料分享

    开发板:迅为IMX6Q移植QTE5.7编译好的ARM版本OpenCV3.4.10文件:OpenCV3.4.10 ARM版编译好的OpenCV依赖库文件:1.将/usr/local/ar
    发表于 07-16 06:55

    如何使用Python配合PyQT5模块来开发图形化应用程序

    By Toradex秦海1).简介随着Python在互联网人工智能领域的流行,大家也慢慢感受到Python开发的便利,本文就基于嵌入式ARM平台,介绍使用Python配合PyQT5模块来开发图形化
    发表于 12-24 06:41

    鲁班猫0 ubuntu20 解决python3.10安装pyqt5

    前面用pip install pyqt5,总是安装不成功。经查阅资料,最后用:udo apt install python3-pyqt5成功安装cat@lubancat:~$
    发表于 04-09 11:04

    OpenCV开发环境的配置

    OpenCV3编程入门》书本配套源代码:OpenCV开发环境的配置
    发表于 06-06 15:20 8次下载

    MAC-OS-X-下用py2app打包PYQT程序

    MAC-OS-X-下用py2app打包PYQT程序(茂硕电源技术参数)-该文档为MAC-OS-X-下用py2app打包PYQT程序讲解教程,是份不错的参考资料,感兴趣的可以下载看看,,
    发表于 09-24 15:33 4次下载
    MAC-OS-X-下用py2app<b class='flag-5'>打包</b><b class='flag-5'>PYQT</b>程序

    OpenCV+PyQT5开发桌面应用几个重要的坑与解决

    大概去年八月份的时候,我打算用OpenCV+PyQT5开发一套OpenCV教学演示与快速验证桌面软件,说实话那个时候我对PyQT5的理解就是Hello World水平。经过一年多
    的头像 发表于 12-13 11:55 1253次阅读

    PyQT5+OpenCV多线程协作演示

    学习多线程最典型的问题就是如何在多个线程之间传递消息与写作,PyQT5的线程支持在不同线程之间传递信号触发事件,实现多个线程之间的协助,完成诸如生产者-消费者这样经典的多线程协作。本文将通过QThread与信号槽机制构建一个生产者-消费者模型,演示多个线程之间的协作。
    的头像 发表于 03-08 14:58 840次阅读

    PyQT开发上位机教程

    了,两个都需要安装,需要记住安装的位置,一会儿需要设置环境变量。 pip install PyQt5pip install PyQt5 - tools ( DemoProject )E : \WorkSp
    发表于 05-08 09:59 3次下载
    <b class='flag-5'>PyQT</b><b class='flag-5'>开发</b>上位机教程

    使用pycharm开发上位机配置pyqt5的环境

    在上位机的开发过程中,使用QT的图形化界面,是开发上位机最好最简单的选择,因此我将讲述配置pyqt5的环境。 软件安装: 安装:pycharm的社区2021.02版 QT(安装参考https
    发表于 05-29 16:12 0次下载
    使用pycharm<b class='flag-5'>开发</b>上位机配置<b class='flag-5'>pyqt</b>5的环境