用PyInstaller打包用PyQt5編寫的python程序
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。
用PyInstaller打包用PyQt5編寫的python程序