用PyInstaller打包用PyQt5編寫的python程式
阿新 • • 發佈:2018-12-31
0.背景
本弱初學PyQt5,寫了一個GUI小程式,但在用PyInstaller打包時出現了不少問題,現將幾個比較大的問題記錄如下,希望以後能記住。
1. 資源打包
首先是資源打包的問題,我寫的程式引用了一張圖片,那麼在沒經過特殊處理的情況下如果想讓程式正常執行,就必須把圖片放在和程式同一個目錄下,但這樣總覺得不太舒服。我在網上看到有三種解決方法:一是通過修改PyInstall配置檔案*.spec來實現打包,但是在我的環境下不成功;二是自己寫程式對圖片進行Base64編碼存在字串裡並存儲在另一個指令碼中,然後令主程式import它;三是用PyQt5自帶的工具:pyrcc5進行處理。本質上第三種和第二種的原理是基本一樣的,但本著“不(xiang)重(jin)復(ban)造(fa)輪(tou)子(lan)”的原則,我更喜歡第三種。操作如下:
一、建立一個副檔名為qrc的檔案,內容如下(mouse.ico是圖片檔案,且<file>標籤可以有多個):
<RCC>
<qresource prefix="/">
<file>mouse.ico</file>
</qresource>
</RCC>
二、在程式目錄執行命令
pyrcc5 images.qrc -o images_qr.py
命令語法類似於gcc,images.qrc是剛才那個檔案,images_qr.py是輸出的含有圖片序列化字串的python檔案。
三、在主程式的開頭引用
import images_qr
同時將文中引用圖片的路徑前加冒號
QIcon(':mouse.ico')
2. PyInstaller打包程式
其次是打包的問題,如果按照普通命令打包,會產生“No module name 'PyQt5.sip'”的錯誤,這是因為PyInstaller沒有找全PyQt5依賴包,需要我們親自指定:
pyInstaller --hidden-import PyQt5.sip -F mousenew.py -w -i mouse.ico
這樣就能成功打包了。
3. 總結
注意以後打包時先別帶-w引數,不然打包後的exe如果執行錯誤就直接彈個Fail to execute the script.然後就退出了,連調都沒法調,如果是命令列打包,至少錯了它還會在命令列列印Traceback,等命令列程式沒錯了再加-w。