手把手教你將pyqt程序打包成exe(2)

手把手教你pyqt程序打包成exe


如果是打包萌新,建議您先看:

上一篇提到打包的環境和打包示例一(沒有外部資源依賴的打包):
手把手教你pyqt打包成exe(1)


這篇將講解示例二(帶有多個外部資源依賴程序的打包),同時進一步講解.spec文件。

0x00 示例二

項目文件結構

在這裏插入圖片描述
需要打包的項目複製出一份,然後適當調整項目文件結構。

爲什麼我一直強調項目文件結構?

我個人覺得,項目文件結構調整好,纔不容易出現因爲在某個py文件引用了其他py的內容,由於自己import操作不當而出現打包後找不到某個引用的模塊等問題。。

再說,如果只是自己
爲了打包一個比較實用的exe(可以發exe文件別人,然後在其他電腦上正常運行),那麼我完全可以將項目文件結構調整的更利於打包的形式。比如:將多個py文件合併到一個py文件,這樣就可以避免因爲自己import不當而出現的打包後運行出錯的問題。

ps:用pyinstaller打包exe,我研究了將近兩天時間,不斷找資料,不斷嘗試。最後作個總結,也希望能夠幫到某些人。如果有不太對的地方,希望大家積極指出~

資源文件說明

示例二項目文件:
引用了多個外部資源文件,如圖中紅色矩形所示。
在這裏插入圖片描述
MainDemo.py集成了其他的py裏的類。

我們的目標是把外部資源文件一起打包”進“exe文件,並且要正常運行。

本來這些外部資源文件不是在src下的,我是爲了避免各種出錯才把它放在了src文件夾下。

這次我們先來單個文件夾打包~

預處理

我們引用的文件資源,路徑全部用的是我們本機上的(相對)路徑。如果移動到其他計算機上,那麼很可能因爲依賴的外部資源文件路徑不同而無法運行。
直接上解決措施吧。
需要新建一個py文件來”凍結”資源文件路徑:
frozen_dir.py

import sys
import os
def app_path():
    """Returns the base application path."""
    if hasattr(sys, 'frozen'):
        # Handles PyInstaller
        return os.path.dirname(sys.executable)
    return os.path.dirname(__file__)

if __name__=='__main__':
    print(app_path())

這個py文件是爲了獲得’凍結了’的基路徑
其他文件路徑,可由基路徑+字符串 拼接獲得。
要注意這個py文件放的位置,要在src下。
在這裏插入圖片描述
要引用外部資源文件的地方,那個py文件要import frozen_dir,
資源路徑 = app_path() + xxx/xx
比如要引用imgs裏面的圖片,

base = frozen_dir.app_path()
圖片路徑 = '{}\imgs\分析.png'.format(base)

引用其他資源文件同理,因爲凍結路徑的py文件和它們一樣都在src下。
這樣不管,在哪臺計算機中運行,都會相對’凍結路徑‘的基路徑來精確獲得資源路徑。

基於凍結的基路徑將引用的外部資源文件的路徑設置好後,我們開始來打包。

單文件夾打包

pyinstaller -D -w -i .\halo.ico .\MainDemo.py

在這裏插入圖片描述
此時去dist中的文件夾下找到exe雙擊運行:
在這裏插入圖片描述
cmd運行:
在這裏插入圖片描述
發現並沒有提示錯誤。
爲什麼?
因爲我能程序裏引用的外部資源並沒有打包進去
我們來修改.spec:
在這裏插入圖片描述
add_files是一個列表,列表裏元素是元組,
元組第一項是要引用的外部資源的路徑(可以是文件/文件夾),第二項是打包進exe,在exe中的路徑(所在文件夾)

然後輸入:

pyinstaller .\MainDemo.spec

重新構建exe
在這裏插入圖片描述
再去dist裏面找exe並運行:
在這裏插入圖片描述

完美~

PS:
細心的崽崽一定會發現,其實只是把外部資源文件拷貝了一份在exe所在的文件夾下,並不是壓縮到exe裏面去~
(圖片資源可以壓縮進exe,通過
編寫qrc文件轉換爲py文件,導入py文件,修改引用----》
手把手教你pyqt中.qrc圖片文件的編寫和使用

在這裏插入圖片描述
所以,剛纔也可以不修改.spec文件,可以直接把外部資源文件拷貝進exe所在文件夾,這樣也可以運行exe。

再次Tip:只要dist文件夾裏的有用,發給別人的時候只需要發這裏面的東西即可(本來pyqt打包的exe就比較龐大,更沒必要發一下沒用的文件給別人)

下面來演示單文件打包。

單文件打包

pyinstaller -F -w -i .\halo.ico .\MainDemo.py

一開始我以爲exe圖標沒有成功加上去。
害的我還不斷嘗試,嘗試的要崩潰的感覺。挺扎心的,不過還好沒放棄~

pyqt打包exe的icon“沒有顯示”的原因:

這裏icon沒顯示的原因:
其實是因爲icon不夠大,而圖標又放的太大顯示不出來。

真的顯示不了的原因可能是圖標不符合icon標準

只需要按住ctrl+鼠標滾輪縮小即可看的icon…
在這裏插入圖片描述
此時雙擊能運行嗎?
我爲啥要先做單文件夾的演示?哈哈~

在這裏插入圖片描述
解決方案和上面一樣。
簡單的肯定不是改.spec文件在重構。
而是把依賴的資源文件/文件夾拷貝到exe所在目錄下。
也正好驗證一下上面提到的!

在這裏插入圖片描述
示例演示就暫時到這裏了,希望能帶給你點啓發,給你點幫助~
如果有幫助或者啓發,關注我,或者給我點個贊,留個言,就是對我最大的鼓勵了!!
------》現在是2020/04/26/ 0:30

.spec文件

篇幅原因 + 太晚了!!
這裏也簡單介紹一點.spec裏面的配置吧。
研究深入點+有時間 再單獨寫一篇吧。
在這裏插入圖片描述

總結

pyqt程序打包成exe需要自己多折騰~
還要想辦法壓縮打包exe的體積。
有時間也可以多去了解一下pyqt生成的exe的編譯和反編譯…

說明

如果有幫助或者啓發,關注我,或者給我點個贊,留個言,就是對我最大的鼓勵了!!** ------》現在是2020/04/26/ 0:59

參考:文獻1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章