用 PyInstaller 打包基于 PyQt 的程序遇到的坑

之前寫了個腳本自己平常工作用,最近因為需要把腳本給其他同事用,為了避免它們還需要配置環境,于是用 PyQt 寫了個界面,然后用 PyInstaller 打包成 exe 。打包過程中遇到了一些坑,紀錄一下。

PyQt

之前寫過一個蝦米歌單導出小腳本,exe 版本是用的 Python 自帶的 Tkinter 寫的,所以這次嘗試用 PyQt。寫的時候遇到了任務欄閃爍和打包后程序界面圖標不顯示的問題。

  • 任務欄閃爍提示

    后臺運行程序的時候,如果使用 QFileDialog ,程序彈出保存對話框的時候會在任務欄閃爍提示。但不是每個 Widget 都會有這個功能,但是這時候可以通過 QtWidgetactivateWindow()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

這次的幾個坑讓我更堅定這類工具最好不要用最新版本,一不見得更穩定,二是遇到問題資料也比較少,在這類不必要的麻煩上花太多時間不值得,除非新版本能有很大的收益。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容