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

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

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

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

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

打包工具選擇

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

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

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

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

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

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

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

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

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

其中requirements.txt里面是需要安裝第三方依賴庫,在該目錄運行命令行即可完成安裝:

pip install -r requirements.txt
參考readme文件,可以完成OpenVINO2022、TensorRT8.x配置支持。 我手寫了一個簡單startup.bat文件,雙擊startup.bat即可運行打包好的應(yīng)用!
@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就可以把對應(yīng)的py文件轉(zhuǎn)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里面去就好啦!

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

    關(guān)注

    29

    文章

    623

    瀏覽量

    41177
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4758

    瀏覽量

    84289
  • pyqt5
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    3388

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

    PyQt5的中文教程電子書免費下載

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

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

    MAC-OS-X-下用py2app打包PYQT程序(茂碩電源技術(shù)參數(shù))-該文檔為MAC-OS-X-下用py2app打包PYQT程序講解教程,是份不錯的參考資料,感興趣的可以下載看看,,
    發(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>記事本

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

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

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

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

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

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

    PyQT開發(fā)上位機教程

    ,兩個都需要安裝,需要記住安裝的位置,一會兒需要設(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'>開發(fā)</b>上位機教程

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

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

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

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