用 PyInstaller 打包基於 PyQt 的程式遇到的坑
之前寫了個指令碼自己平常工作用,最近因為需要把指令碼給其他同事用,為了避免它們還需要配置環境,於是用 PyQt 寫了個介面,然後用 PyInstaller 打包成 exe 。打包過程中遇到了一些坑,紀錄一下。
PyQt
之前寫過一個蝦米歌單匯出小指令碼,exe 版本是用的 Python 自帶的 Tkinter 寫的,所以這次嘗試用 PyQt。寫的時候遇到了工作列閃爍和打包後程式介面圖示不顯示的問題。
-
工作列閃爍提示
後臺執行程式的時候,如果使用
QFileDialog
,程式彈出儲存對話方塊的時候會在工作列閃爍提示。但不是每個 Widget 都會有這個功能,但是這時候可以通過QtWidget
的 activateWindow() 和 QApplication.alert() 來實現,但這兩者使用的時候會有點區別。activateWindow()
是例項方法,只要程式視窗切換到前臺被啟用了就不會再閃爍。而QApplication.alert(QWidget, msecs: int = 0)
是靜態方法,msecs
值為 0 的時候,和activateWindow()
的效果一致,但是需要在閃爍停了之後啟用程式才會工作列視窗顏色才會恢復正常,否則還是黃色,直到閃爍停了之後再啟用一次程式。msecs
不為 0 的時候,超過這個時間後,工作列視窗就會自動恢復正常。所以activateWindow()
是比較好的選擇,除非不要求一直在工作列提示。 -
資原始檔在打包時的處理
把程式碼用 PyInstaller 打包到一個檔案的時候,會出現圖示或圖片都不顯示的情況。這種時候就需要用 Qt’s resource system 來對其進行打包。
首先新建一個 .qrc 檔案,內容格式如下:
<RCC> <qresource prefix="/" > <file>img/image1.png</file> <file>img/image2.png</file> <file>img/image3.png</file> </qresource> </RCC>
然後去檔案目錄下執行
pyrcc5 -o images_qr.py images.qrc
命令,最後在程式碼中 import image_qr.py,並且修改下圖片路徑,一定要在路徑前面加上冒號。import image_qr.py # your code self.setWindowIcon(QtGui.QIcon(':/img/image1.png'))
PyInstaller
之前用 cx_freeze 打過包,但感覺不理想,搜尋了下發現 PyInstaller 用得比較多,就使用了這個,第一次用的時候沒遇到問題,但是因為 Python 是裝的 64 位的,所以打包之後的程式無法在 32 位的機器上使用。這就意味著我必須要在 Python 32 位的環境下打包,但重新配置了下環境之後,遇到了 ImportError 和無法連結到動態庫的問題。
-
ImportError: DLL load failed
用 PyInstaller 給程式打包的時候遇到了
pyi_rth_qt5plugins returned -1
的 Fatal Error 提醒。這個錯誤資訊幾乎是毫無用處的,修改 .spec 檔案,開啟 debug 模式以及顯示 console 後,在running pyi_rth_qt5plugins.py
的時候發生了ImportError: DLL load failed 找不到指定的模組
錯誤。回頭想起了在編譯的時候看到了很多 WARNNING 訊息,回過頭檢視,發現了很多
lib not found
的問題。但是仔細檢查了 Python 庫之後,這些 DLL 明明在C:\Python35-32\Lib\site-packages\PyQt5\Qt\bin
目錄下,最後的搜尋得到的解決辦法是把這個目錄新增到環境變數裡。問題得到了解決,猜測原因是因為之前使用 pip 安裝 PyQt 的時候, pypi.python.org 總是連線不順暢,最後去下了個 .whl 檔案直接安裝,導致沒有對應環境變數打包的時候找不到 DLL。
# 環境: Python == 3.5.2 ,PyInstaller == 3.1.1 10951 WARNING: lib not found: Qt5Svg.dll dependency of C:\python35-32\lib\site-packages\PyQt5\Qt\plugins\imageformats\qsvg.dll 11206 WARNING: lib not found: Qt5Gui.dll dependency of C:\python35-32\lib\site-packages\PyQt5\Qt\plugins\imageformats\qsvg.dll 11437 WARNING: lib not found: Qt5Core.dll dependency of C:\python35-32\lib\site-packages\PyQt5\Qt\plugins\imageformats\qsvg.dll 11763 WARNING: lib not found: Qt5Gui.dll dependency of C:\python35-32\lib\site-packages\PyQt5\Qt\plugins\imageformats\qtga.dll 12017 WARNING: lib not found: Qt5Core.dll dependency of C:\python35-32\lib\site-packages\PyQt5\Qt\plugins\imageformats\qtga.dll 12224 WARNING: lib not found: Qt5Gui.dll dependency of C:\python35-32\lib\site-packages\PyQt5\Qt\plugins\platforms\qminimal.dll 12418 WARNING: lib not found: Qt5Core.dll dependency of C:\python35-32\lib\site-packages\PyQt5\Qt\plugins\platforms\qminimal.dll 12625 WARNING: lib not found: Qt5Gui.dll dependency of C:\python35-32\lib\site-packages\PyQt5\Qt\plugins\platforms\qwindows.dll 12833 WARNING: lib not found: Qt5Core.dll dependency of C:\python35-32\lib\site-packages\PyQt5\Qt\plugins\platforms\qwindows.dll
-
api-ms-win-crt-runtime 錯誤
PyInstaller 打包之後的程式執行的時候發生
api-ms-win-crt-runtime
動態庫之類的錯誤,似乎只有在 Python 3.5 下打包才會遇到。因為 Universal CRT (KB2999226)缺失,可以通過安裝此更新來解決問題。或者直接下載 Visual C++ Redistributable (x86 ,x64 )。參考連結:api-ms-win-crt-runtime-l1-1-0.dll is missing when open office file
這次的幾個坑讓我更堅定這類工具最好不要用最新版本,一不見得更穩定,二是遇到問題資料也比較少,在這類不必要的麻煩上花太多時間不值得,除非新版本能有很大的收益。
相關文章
- [PY] PyQT 依賴 pyinstaller 打包QT
- 關於Pyinstaller在打包Streamlit程式時遇到的IndexError:tuple index out of rangeIndexError
- Pyinstaller打包Pytorch框架所遇到的問題PyTorch框架
- py3.7.1下pyinstaller 的安裝及打包 坑
- 用pyinstaller打包你的Python程式並繫結CPUPython
- 使用PyInstaller打包Python程式Python
- 小程式 遇到的坑
- 在 Mac 上打包 PyQT 程式MacQT
- PyInstaller打包Python程式為exePython
- python3.6 使用pyinstaller 打包web程式的方法PythonWeb
- Pyinstaller打包用spec新增資原始檔
- 小程式使用Picker遇到的坑
- 基於PyTesseract與PyQt5 的中文OCR識別應用程式設計QT程式設計
- 使用 pyinstaller 打包 py 檔案成 exe 程式
- docker 打包 selenium+chromedriver+chrome 遇到的坑和解決方案DockerChrome
- Python---pyinstaller打包Python
- 【python】打包神器--pyinstallerPython
- Pyinstaller利用spec檔案打包的使用模板
- Pyinstaller打包pikepdf失敗的問題排查
- 用DataX導資料到Clickhouse遇到的坑
- mpvue遇到的坑Vue
- 關於jqGrid+mybatisplus遇到的坑MyBatis
- python檔案打包利器之pyinstaller的使用Python
- pyinstaller_pytest.main_打包AI
- 記錄一次用 ThinkPHP 小程式登陸遇到的坑PHP
- 微信小程式開發遇到的那些坑微信小程式
- 基於PYQT5的截圖翻譯工具QT
- 關於安裝black apple遇到的坑APP
- RSA加密遇到的坑加密
- Laravel Excel 遇到的坑LaravelExcel
- NSString 遇到的坑
- 使用dataX遇到的坑
- Laravel Session 遇到的坑LaravelSession
- 【eclipse遇到的坑】Eclipse
- 使用pyinstaller打包exe檔案教程
- 初學 GoLang 遇到的一個關於時間的坑...Golang
- python3使用pyinstaller打包apscheduler出的錯Python
- 關於SpringBoot結合mybatis後遇到的坑Spring BootMyBatis