首頁 > 軟體

Pyinstaller打包多個資原始檔的超詳細教學(推薦!)

2022-12-27 14:00:33

有時我們需要將python源程式使用pyinstaller打包成可執行exe釋出,而除了我們常用的新增exe圖示功能外,很多時候還希望能把各種圖片、聲音、字型等資源打包到exe中。尤其是在使用“-F”指令時,很多時候並不想看到如下圖的情況(程式打包到一個exe檔案了,但資原始檔仍然是孤零零的一大堆),這樣很不利於釋出~~

那我們應該怎麼辦呢?網上很多教學都講的不夠詳細,這裡就不一一列舉了。我們採用最強大的方法,直接修改pyinstaller生成的spec檔案(在這裡因為原始碼是“main.py”,所以生成的spec預設檔名為“main.spec”)。

首先,先確認自己是否安裝pyinstaller(什麼?我還沒有安裝?不好意思,請先查閱其他教學進行安裝,完成後再來看本文章)

其次,確認一下自己源程式內import的所有三方庫是否均已安裝。這裡可能會出現執行時正常,打包好後報錯提示“XXX庫找不到”的情況。這是因為電腦上裝有多個Python,在執行時呼叫的是環境A,而在打包時預設的pyinstaller卻是在環境B下的。(什麼?不會解決此問題?請先移步至別的文章學習)

這兩步完成後,我們開始正式的打包。首先在python原始檔的資料夾內上方位址列中輸入“cmd”後回車,cmd則會自動跳轉到當前路徑,如下圖所示

輸入如下命令後回車

pyi-makespec -F -w -i favicon.ico main.py

其中“pyi-makespec”會生成一個spec檔案(用於指定打包的設定),“-F”效果是打包成一個檔案,“-w”則可以使打包後的程式執行時不彈出黑視窗(在打包使用圖形介面庫的程式碼,如tkinter、pyqt5、pygame時很有用)。“-i”後跟一個ico格式(其他格式會報錯)的圖示,則可以指定打包後程式的圖示。“main.py”是你要打包程式的入口檔案(其他被呼叫的檔案會自動匯入)

執行後如下圖所示

可以看到多出了一個“main.spec”檔案(本質上是txt文字檔案,可用記事本開啟,是實現預設/個性化打包的檔案)

我們用記事本開啟,可以看到如下內容

可以看到剛剛執行的一些附加條件,如不顯示console,設定圖示為favcon.ico等。而我們在此問題中需要關注的是“datas=[]”,這裡可以指定打包的資原始檔。
接下來在python主檔案最前面加入下面的程式碼

import os
import sys

# 資原始檔目錄存取
def source_path(relative_path):
    # 是否Bundle Resource
    if getattr(sys, 'frozen', False):
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)


# 修改當前工作目錄,使得資原始檔可以被正確存取
cd = source_path('')
os.chdir(cd)

這段程式碼的功能是,當程式未打包時,不改變當前工作目錄;當程式被pyinstaller打包成exe時,則會將工作目錄修改為一個臨時資料夾"C:Users23121AppDataLocalTemp_MEI172602",屆時打包好的程式會將資原始檔都放到此處。

接下來我們解析“datas=[]”,此列表內可以加入一個元組(注意,此元組最多可以有兩個元素)指定要打包的資源和打包後在臨時資料夾內的資料夾名稱。比如“datas=[(‘res’,‘.’)]”第一個res代表需要打包的資料夾名res,其內部存放的全都是各種資原始檔。第二個’.‘代表打包後在臨時檔案中的資料夾名稱。因為我的程式資源原本是存放在main.py的同級目錄的,所有這裡不需要執行後將資源釋放到指定的資料夾中,直接使用’.'即可。如本身被呼叫的資源就在一個二級資料夾“resoure”裡,則修改為“datas=[(‘res’,‘resource’)]”。

下圖為修改後的main.spec

然後建立一個名為“res”的資料夾,將需要打包的資源全部放進去(注意:不需要把程式圖示也放進去,“favicon.ico”必須放到“main.py”同級目錄,否則在打包時會提示找不到圖示檔案)

接下來回到剛剛的cmd視窗中執行下面的命令

pyinstaller main.spec

可以看到已經成功打包了。

這時會多出一個dist資料夾,我們打包好的程式就在裡面。

現在程式已經能獨立執行了,我們執行程式後看一下資源被釋放到的路徑:

可以看到資源全部被臨時釋放到這裡了。關閉程式後再次嘗試進入此資料夾:

可以發現我們的臨時資料夾被清除了。

至此,這篇關於pyinstaller如何打包多個資原始檔的教學就結束了。

總結

到此這篇關於Pyinstaller打包多個資原始檔的文章就介紹到這了,更多相關Pyinstaller打包多個資原始檔內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com