1. 程式人生 > >總結使用pyinstaller打包pyqt5以及pytorch的各種坑

總結使用pyinstaller打包pyqt5以及pytorch的各種坑

python可以用於打包的庫

pyinstaller是打包python的一個很好用的一個庫。

下面總結下使用pyinstaller的經驗,以及打包pyqt5做的介面和打包深度學習框架pytorch。

一.使用pyinstaller

 

  1. 使用pip installer pyinstaller 安裝庫即可(不是很好用有時候安裝上去還是顯示沒)  也可以到官網上下載 https://www.pyinstaller.org/downloads.htm    下載tar.gz 格式的解壓到一個資料夾,在該路徑下開啟命令列視窗,使用 pip setup.py install 即可。
  2. win7需要裝pywin32,同樣使用pip install 安裝就行。
  3. 找到需要打包的py檔案目錄,shift+右鍵 點選 在此處開啟命令列視窗(或者知道路徑 使用cd 也可以),此時命令列視窗顯示路徑與py檔案目錄一致
  4. 使用命令 pyinstaller XXX.py       當然也有可以選的引數 引數加在兩者中間 如打包成一個exe檔案 pyinstaller -F XXX.py 以下是引數列表

   5.如果沒有錯誤的話(錯誤怎麼解決下面會講),命令列視窗最後會顯示一個successfully,同時檔案同一目錄下會生成build和dist資料夾 exe可執行檔案在dist資料夾裡面。

  6.一般情況下,打包好會發現特別大,原因是寫程式碼是沒有注意,有的庫只用到了一個小模組,就直接呼叫一個大模組,這樣會造成把一些不需要的也打包進來了。 用到YYY時 使用 from XXX import YYY 而不是直接使用import XXX  。這兩種形式程式碼中呼叫也不一樣。這裡拿 sys模組演示 。使用import sys 程式碼中 呼叫 argv模組就是 os.argv  而from os import argv 程式碼中就直接argv就可以了。 如果想檢視argv是否是sys中一個小模組可以這樣檢視

 二.打包pyqt5

1.好像是因為版本相容性的問題使用pyinstaller打包pyqt5需要在同一目錄下放入一些動態連結庫。需要C:\ProgramData\Anaconda3\Lib\site-packages\PyQt5\Qt\plugins中的 platforms資料夾,放入到需要打包的同一目錄下。

2.使用 pyinstaller -w XXX.py  可以在執行的時候不顯示命令列框,只顯示ui介面,但是如果出錯的話也不會報錯,建議先使用pyinstaller -c XXX.py  打包(會顯示執行情況,出錯會報錯),在確定沒錯的情況下,再使用 -w

3.報錯  AttributeError : 'str' object has no attribute 'items'    解決方式  重新安裝setuptools (pip uninstall setuptools )

在anconda中解除安裝setuptools顯示有一程式正在佔用  解決方法:重啟電腦再次嘗試 

4報錯 Cannot find existing PyQt5 plugin directories      解決辦法:建立路徑C:\Users\ray\qtb-3.5-64\_b_env\Library\plugins  在裡面新增兩個檔案 pyqt5.dll  pyqt5qmlplugin.dll  (直接按名字搜 看大小跟我的一樣應該就是了)

5報錯 UnicodeDecodeError:  utf-8 code can't decod byte Oxce  in position x:      解決辦法:在這句話上面有報錯的py檔案的名字路徑報錯誤的位置  找到之後 把裡面的decode給改成了  "utf8","ignore"

6.我的問題解決  (實際中只用qt 並沒這麼多的問題 ) 

三.打包深度學習框架pytorch

1.pytorch出來沒多久,打包網上案例不是很多,我們使用pytorch做了一個目標檢測的小demo,在打包過程中也是出現各種錯誤。

2.報錯 Maximum recursion depth exceeded    解決方法: 處理太快了我們需要降降速。在同一資料夾下會有一個xxx.spec檔案開啟之後 在最上面新增兩行程式碼   

import sys

 sys.setrecursionlimit(5000)

儲存之後 再次進入命令列視窗  pyinstaller xxx.spec (注意要使用這個程式碼 不用再新增引數)

3.打包好之後生成了exe檔案 並且在原電腦上可以執行另一臺沒有環境的電腦會報錯   script pyi_rth_win32comgenpy 

解決辦法:重灌pywin32  。在這裡如果使用anconda pywin32是很難卸掉的,需要先將pip降級到9.0(pip install "pip<10")再進行解除安裝pywin32再把pip升級到原版本(pip install pip --upgrade)再安裝pywin32(如果pip沒法降的話建議直接上官網找個9.0版本的whl格式或者壓縮包進行安裝,這樣是強制性的安裝 anconda阻止不了)

4.報錯 This applicantion failed to start because it could not find or load the Qt platform plugin "windows"

解決方式: 重灌pyqt5 

5.終於解決這些問題可以在其他電腦上開啟ui介面了,但是問題還沒結束 沒法執行.....

遇到這種情況一定要使用 pyinstaller -c xxx.py 進行打包,不然的話是看不到錯誤在哪的 ,這樣沒法解決問題的。
錯誤 :UnicodeDecodeError:  utf-8 code can't decod byte Oxce  in position x:  (同上面的問題5不過這次需要改的檔案沒那麼簡單)

可以看出來這些檔案都是些 “不能改” 的檔案,但是為了解決問題,不管能不能改 都得改,直接找到原始碼找到報錯的那幾行看到有 decode函式的裡面直接改成 "utf8","ignore"

6. 報錯 TypeError :pic should be PIL Image or ndarray .Got<class 'Nonetype'>

解決方式 :torch有一個transform函式中不接受從opencv開啟的圖片,只接受物件和PIL開啟的照片。檢查寫的程式碼把使用opencv開啟的圖片換成 使用PIL的Images開啟

7.終於成功,一天半的時間 盯著命令列視窗 看著各種錯誤,終於全部解決。

 

如有問題,或有什麼建議可加群:894243022或發郵箱[email protected] 

歡迎前來交流!

使用本文章請宣告!