最近用PyQt5寫了一個界面小程式,需要打包成exe給到其他windows上使用,一開始使用python 3.7 64位,用pyinstaller打包exe,在64位機上運行正常。 但是目標電腦是32位的,所以需要打包32位exe,然後問題就出現了。 打包32位exe, 雖然網上有教程說使用 Ana ...
最近用PyQt5寫了一個界面小程式,需要打包成exe給到其他windows上使用,一開始使用python 3.7 64位,用pyinstaller打包exe,在64位機上運行正常。 但是目標電腦是32位的,所以需要打包32位exe,然後問題就出現了。
打包32位exe, 雖然網上有教程說使用 Anaconda 生成python 的32位環境,我試了,但是沒有成功,轉而選擇卸載64位python,不如直接裝32位的python, 依舊使用pyinstaller 打包
打包時雖然有幾個警告但貌似還順利,點開exe後報 "failed to execute script XXX",更換了多個python 版本,裝了卸卸了裝,翻了很多資料都沒有解決,於是打算自力更生
眾所周知,可以用這條命令打包不帶控制台的exe:
pyinstaller -w -F xxx.py
但這樣就沒辦法看到報錯了,因此保留控制台:
pyinstaller -F xxx.py
打包後,程式一閃而過,用手機開視頻錄下來(60fps), 畫質很渣但是依然無法看漏“unable to find QtCore.dll on PATH”:
問題應該就是丟失PyQt庫了,少了就補上吧~ 直接將這個dll拷貝到 C:\Windows\System32下,然後開開心心的點開exe,問題就解決了~.....才沒有解決......
需要把python的PyQt5庫路徑添加到環境變數PATH中才行,這回就真的能跑起來了,很開心(實際上到這一步折騰了很久),不過估計要在目標電腦裝好PyQt5,然後添加環境變數,雖然有點麻煩但是能用。
事情就這麼告一段落了....
才沒有告一段落,我並不甘心,憑什麼64位跑得好好的,32位就丟dll,憑什麼命令行運行正常,exe就丟東西?而且我到exe的臨時目錄看了,實際上Qt5Core.dll等庫都好好的躺在裡面的,但是為什麼就有說找不到,然後嘗試了
1. 把Qt5Core.dll強行再打包在exe中,這個可以編輯spec文件實現,改datas那行,不行!
2. 嘗試在運行時調整運行路徑,或者添加臨時路徑,讓程式可以識別原本就在同一層目錄下的dll們,沒有找到類似的教程(這樣的需求本來就很奇怪吧?)
3. 換了另一臺試了下,建了個虛擬機試了下,以排除系統區別,不行
4. 換了低版本的python 試了下,不行
5. 嘗試更換打包軟體,好像大多都是pyinstaller,還有py_win32,cx_Freeze等,py_win32貌似需要重新寫界面,cx_Freeze按常式跑了下一點效果都沒有。
費了很長時間,可以說很心累了,有幸看到了一篇博文:
標題可以看出很接近了,其實降低了PyQt5的版本就可以了,似乎不需要像這篇博文裡面降低pyinstaller的版本(3.5),打包後不用添加環境變數也可以正常運行了,exe體積還降低了一半...
一開始我用的PyQt5.13.0打包32位報錯,降低到5.9.2就沒問題了,順便記一下pip安裝指定版本的庫:
pip install pyqt5==5.9.2
我喜歡把各種依賴的庫寫在一個cmd文件中,需要安裝環境時雙擊一下就完事了
總結一下就是:
Pyinstaller打包PyQt5程式時,若提示丟失dll文件,可嘗試降低PyQt5的版本,如pyinstaller3.5 + PyQt5.9.2組合 (@Windows 7 x64 SP1 + python 3.7.4 x32)