0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PyQT5+OpenCV開(kāi)發(fā)的應(yīng)用如何打包發(fā)布?

OpenCV學(xué)堂 ? 來(lái)源:OpenCV學(xué)堂 ? 作者:OpenCV學(xué)堂 ? 2022-10-25 09:40 ? 次閱讀

打包工具選擇

我自己用PyQT5寫(xiě)了一個(gè)應(yīng)用程序,基本上都寫(xiě)好了,到了打包發(fā)布這個(gè)環(huán)節(jié),我知道的有兩個(gè)工具可以幫我打包分別是

Pyinstaller
Cython
pyinstaller會(huì)給我打包成一個(gè)exe文件,把python解釋器、所有依賴(lài)包、各種DLL都打包在里面,然后最終出來(lái)一個(gè)exe文件,聽(tīng)上去是很好。 Cython會(huì)給打包成pyd文件,然后依靠包導(dǎo)入的方式完成啟動(dòng),不會(huì)生成exe文件,聽(tīng)上去沒(méi)有pyinstaller好 兩個(gè)工具的安裝都十分方便快捷:
pip install pyinstaller
pip install Cython
這兩個(gè)我都測(cè)試了,最終我選擇用Cython完成了打包發(fā)布。為什么不用pyinstaller,打包出來(lái)的exe文件比較大,然后各種命令行操作我也不太熟悉,已經(jīng)學(xué)廢了。然后打包完成之后各種DLL無(wú)法load跟找不到,時(shí)間不等人啊!最重要的,pyinstaller打包完成exe其實(shí)就是一個(gè)壓縮包,特別容易被反編譯跟逆向工程取得源碼!誰(shuí)讓我已經(jīng)用過(guò)這招,所以我猜別人也會(huì)用。 選擇Cython是轉(zhuǎn)C然后編譯生成的,想要逆向是十分困難,源碼保護(hù)會(huì)好點(diǎn),另外Cython打包只要一個(gè)腳本運(yùn)行一下就好啦,這個(gè)腳本還是我從網(wǎng)上的來(lái)的,感謝這個(gè)腳本作者!腳本隨便改了改,就可以直接使用了。

打包流程與目錄結(jié)構(gòu)

在開(kāi)始打包之前,先把一些非源碼的文件整理好,放在項(xiàng)目的資源文件夾下面,我有兩個(gè)資源文件夾分別是images跟models,它們就不用打包了。然后我把我的五個(gè)源碼文件夾

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

以dlcore為例,修改腳本,運(yùn)行package_installer,腳本我也貼出來(lái),有需求的自取,放到跟項(xiàng)目同層目錄下面,會(huì)自動(dòng)創(chuàng)建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,)):
'''
刪除編譯過(guò)程中生成的.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文件夾中生成對(duì)應(yīng)的pyd文件如下:

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

運(yùn)行完這些源碼文件夾把得到pyd文件分別拷貝到另外一個(gè)目錄下對(duì)應(yīng)文件夾中,最終我的打包好的目錄結(jié)構(gòu)如下:

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

其中requirements.txt里面是需要安裝第三方依賴(lài)庫(kù),在該目錄運(yùn)行命令行即可完成安裝:

pip install -r requirements.txt
參考readme文件,可以完成OpenVINO2022、TensorRT8.x配置支持。 我手寫(xiě)了一個(gè)簡(jiǎn)單startup.bat文件,雙擊startup.bat即可運(yùn)行打包好的應(yīng)用!
@echo "try to run openvm"
SET PYTHONPATH=.%PYTHONPATH%
cd ui
python application_ui.py

運(yùn)行截圖如下:

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

遇到的坑

最后說(shuō)一下,我用cython打包遇到的一個(gè)大坑:

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

我有個(gè)超類(lèi)ImageTask,然后里面定義幾個(gè)抽象方法,其中一個(gè)方法名是exec,誰(shuí)知道這個(gè)是cython無(wú)法解析的字符串,我猜可能因?yàn)榇a安全檢測(cè)無(wú)法通過(guò),所以一直給報(bào)截圖的錯(cuò)誤,后面我把這個(gè)方法名稱(chēng)從exec改成t_exec就可以把對(duì)應(yīng)的py文件轉(zhuǎn)pyd文件了。

使用pyinstaller打包時(shí)候會(huì)遇到

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里面去就好啦!

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41349
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84688
  • pyqt5
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    3402

原文標(biāo)題:PyQT5+OpenCV開(kāi)發(fā)的應(yīng)用如何打包發(fā)布?

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    可視可交互!H618上用OpenCV讀取圖像顯示到PyQt5窗口上

    這里分享一個(gè)代碼,功能是使用圖像處理庫(kù)opencv從攝像頭獲取數(shù)據(jù),縮放后從pyqt5的窗口中顯示出來(lái)。安裝opencvsudo pip3 install opencv-python創(chuàng)建一個(gè)
    發(fā)表于 01-10 09:55

    求助工具里的網(wǎng)頁(yè)發(fā)布打包問(wèn)題

    小編遇到現(xiàn)在將程序打包成安裝包以后,其安裝以后工具選項(xiàng)里沒(méi)有網(wǎng)頁(yè)發(fā)布工具,怎么將網(wǎng)頁(yè)發(fā)布功能打包進(jìn)安裝程序?求各路大神告知
    發(fā)表于 08-31 09:35

    【Firefly RK3399試用體驗(yàn)】第二篇:PyQt5大戰(zhàn)點(diǎn)燈

    ,使用命令apt install python3-pyqt5Ubuntu里也提供了一些IDE開(kāi)發(fā)工具如IDLE、Spyder等等,此處不詳細(xì)介紹它們安裝過(guò)程。之后我們開(kāi)始編寫(xiě)Pyqt5點(diǎn)燈,需要的前提
    發(fā)表于 06-12 07:49

    OpenCV學(xué)習(xí)之路--5--OpenCV3.4.10的ARM版本移植到開(kāi)發(fā)板 精選資料分享

    開(kāi)發(fā)板:迅為IMX6Q移植QTE5.7編譯好的ARM版本OpenCV3.4.10文件:OpenCV3.4.10 ARM版編譯好的OpenCV依賴(lài)庫(kù)文件:1.將/usr/local/ar
    發(fā)表于 07-16 06:55

    如何使用Python配合PyQT5模塊來(lái)開(kāi)發(fā)圖形化應(yīng)用程序

    By Toradex秦海1).簡(jiǎn)介隨著Python在互聯(lián)網(wǎng)人工智能領(lǐng)域的流行,大家也慢慢感受到Python開(kāi)發(fā)的便利,本文就基于嵌入式ARM平臺(tái),介紹使用Python配合PyQT5模塊來(lái)開(kāi)發(fā)圖形化
    發(fā)表于 12-24 06:41

    OpenCV開(kāi)發(fā)環(huán)境的配置

    OpenCV3編程入門(mén)》書(shū)本配套源代碼:OpenCV開(kāi)發(fā)環(huán)境的配置
    發(fā)表于 06-06 15:20 ?8次下載

    PyQt5的中文教程電子書(shū)免費(fèi)下載

     本教程的目的是帶領(lǐng)你入門(mén)PyQt5。教程內(nèi)所有代碼都在Linux上測(cè)試通過(guò)。PyQt4 教程是PyQt4的教程,PyQt4是一個(gè)Python(同時(shí)支持 2和3)版的Qt庫(kù)。
    發(fā)表于 08-06 08:00 ?18次下載
    <b class='flag-5'>PyQt5</b>的中文教程電子書(shū)免費(fèi)下載

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

    MAC-OS-X-下用py2app打包PYQT程序(茂碩電源技術(shù)參數(shù))-該文檔為MAC-OS-X-下用py2app打包PYQT程序講解教程,是份不錯(cuò)的參考資料,感興趣的可以下載看看,,
    發(fā)表于 09-24 15:33 ?4次下載
    MAC-OS-X-下用py2app<b class='flag-5'>打包</b><b class='flag-5'>PYQT</b>程序

    notepad-pyqt5 PyQt記事本

    ./oschina_soft/gitee-notepad-pyqt5.zip
    發(fā)表于 05-24 09:20 ?4次下載
    notepad-<b class='flag-5'>pyqt5</b> <b class='flag-5'>PyQt</b>記事本

    運(yùn)用JNI連結(jié)OpenCV開(kāi)發(fā)C++并打包成aar lib的使用教學(xué)

    本身是作影像視覺(jué)相關(guān)的工作,多數(shù)時(shí)候都使用 Python 作為開(kāi)發(fā)語(yǔ)言,但OpenCV 本身是C++開(kāi)發(fā),學(xué) C++ 應(yīng)該有幫助。
    的頭像 發(fā)表于 08-15 09:24 ?1601次閱讀

    OpenCV+PyQT5開(kāi)發(fā)桌面應(yīng)用幾個(gè)重要的坑與解決

    大概去年八月份的時(shí)候,我打算用OpenCV+PyQT5開(kāi)發(fā)一套OpenCV教學(xué)演示與快速驗(yàn)證桌面軟件,說(shuō)實(shí)話(huà)那個(gè)時(shí)候我對(duì)PyQT5的理解就是Hello World水平。經(jīng)過(guò)一年多
    的頭像 發(fā)表于 12-13 11:55 ?1699次閱讀

    PyQT5+OpenCV多線程協(xié)作演示

    學(xué)習(xí)多線程最典型的問(wèn)題就是如何在多個(gè)線程之間傳遞消息與寫(xiě)作,PyQT5的線程支持在不同線程之間傳遞信號(hào)觸發(fā)事件,實(shí)現(xiàn)多個(gè)線程之間的協(xié)助,完成諸如生產(chǎn)者-消費(fèi)者這樣經(jīng)典的多線程協(xié)作。本文將通過(guò)QThread與信號(hào)槽機(jī)制構(gòu)建一個(gè)生產(chǎn)者-消費(fèi)者模型,演示多個(gè)線程之間的協(xié)作。
    的頭像 發(fā)表于 03-08 14:58 ?1338次閱讀

    PyQT開(kāi)發(fā)上位機(jī)教程

    ,兩個(gè)都需要安裝,需要記住安裝的位置,一會(huì)兒需要設(shè)置環(huán)境變量。 pip install PyQt5pip install PyQt5 - tools ( DemoProject )E : \WorkSp
    發(fā)表于 05-08 09:59 ?3次下載
    <b class='flag-5'>PyQT</b><b class='flag-5'>開(kāi)發(fā)</b>上位機(jī)教程

    使用pycharm開(kāi)發(fā)上位機(jī)配置pyqt5的環(huán)境

    在上位機(jī)的開(kāi)發(fā)過(guò)程中,使用QT的圖形化界面,是開(kāi)發(fā)上位機(jī)最好最簡(jiǎn)單的選擇,因此我將講述配置pyqt5的環(huán)境。 軟件安裝: 安裝:pycharm的社區(qū)2021.02版 QT(安裝參考https
    發(fā)表于 05-29 16:12 ?0次下載
    使用pycharm<b class='flag-5'>開(kāi)發(fā)</b>上位機(jī)配置<b class='flag-5'>pyqt5</b>的環(huán)境

    基于PyQT5與ONNXRUNTIME實(shí)現(xiàn)風(fēng)格遷移應(yīng)用

    2023年一月份跟二月份創(chuàng)建了一個(gè)PyQT5人工智能軟件開(kāi)發(fā)系列的文章系列,過(guò)去的兩個(gè)月都沒(méi)怎么更新,心里一直想有時(shí)間繼續(xù)更新下去,今天又更新了一篇,基于PyQT5實(shí)現(xiàn)多線程、界面化、風(fēng)格遷移模型的實(shí)時(shí)推理。
    的頭像 發(fā)表于 10-25 10:35 ?527次閱讀
    基于<b class='flag-5'>PyQT5</b>與ONNXRUNTIME實(shí)現(xiàn)風(fēng)格遷移應(yīng)用