打包工具選擇
我自己用PyQT5寫了一個應用程序,基本上都寫好了,到了打包發布這個環節,我知道的有兩個工具可以幫我打包分別是
Pyinstaller Cythonpyinstaller會給我打包成一個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,它們就不用打包了。然后我把我的五個源碼文件夾
以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文件如下:
運行完這些源碼文件夾把得到pyd文件分別拷貝到另外一個目錄下對應文件夾中,最終我的打包好的目錄結構如下:
其中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
運行截圖如下:
遇到的坑
最后說一下,我用cython打包遇到的一個大坑:
我有個超類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
+關注
關注
31文章
642瀏覽量
42241 -
python
+關注
關注
56文章
4822瀏覽量
85860 -
pyqt5
+關注
關注
0文章
25瀏覽量
3475
原文標題:PyQT5+OpenCV開發的應用如何打包發布?
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
可視可交互!H618上用OpenCV讀取圖像顯示到PyQt5窗口上
【Firefly RK3399試用體驗】第二篇:PyQt5大戰點燈
OpenCV學習之路--5--OpenCV3.4.10的ARM版本移植到開發板 精選資料分享
如何使用Python配合PyQT5模塊來開發圖形化應用程序
PyQt5的中文教程電子書免費下載

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

運用JNI連結OpenCV開發C++并打包成aar lib的使用教學
OpenCV+PyQT5開發桌面應用幾個重要的坑與解決
PyQT5+OpenCV多線程協作演示
PyQT開發上位機教程

使用pycharm開發上位機配置pyqt5的環境

基于PyQT5與ONNXRUNTIME實現風格遷移應用

評論