Pyinstaller打包多個(gè)資源文件的超詳細(xì)教程(推薦!)
有時(shí)我們需要將python源程序使用pyinstaller打包成可執(zhí)行exe發(fā)布,而除了我們常用的添加exe圖標(biāo)功能外,很多時(shí)候還希望能把各種圖片、聲音、字體等資源打包到exe中。尤其是在使用“-F”指令時(shí),很多時(shí)候并不想看到如下圖的情況(程序打包到一個(gè)exe文件了,但資源文件仍然是孤零零的一大堆),這樣很不利于發(fā)布~~

那我們應(yīng)該怎么辦呢?網(wǎng)上很多教程都講的不夠詳細(xì),這里就不一一列舉了。我們采用最強(qiáng)大的方法,直接修改pyinstaller生成的spec文件(在這里因?yàn)樵创a是“main.py”,所以生成的spec默認(rèn)文件名為“main.spec”)。
首先,先確認(rèn)自己是否安裝pyinstaller(什么?我還沒(méi)有安裝?不好意思,請(qǐng)先查閱其他教程進(jìn)行安裝,完成后再來(lái)看本文章)
其次,確認(rèn)一下自己源程序內(nèi)import的所有三方庫(kù)是否均已安裝。這里可能會(huì)出現(xiàn)運(yùn)行時(shí)正常,打包好后報(bào)錯(cuò)提示“XXX庫(kù)找不到”的情況。這是因?yàn)殡娔X上裝有多個(gè)Python,在運(yùn)行時(shí)調(diào)用的是環(huán)境A,而在打包時(shí)默認(rèn)的pyinstaller卻是在環(huán)境B下的。(什么?不會(huì)解決此問(wèn)題?請(qǐng)先移步至別的文章學(xué)習(xí))
這兩步完成后,我們開(kāi)始正式的打包。首先在python源文件的文件夾內(nèi)上方地址欄中輸入“cmd”后回車(chē),cmd則會(huì)自動(dòng)跳轉(zhuǎn)到當(dāng)前路徑,如下圖所示


輸入如下命令后回車(chē)
pyi-makespec -F -w -i favicon.ico main.py
其中“pyi-makespec”會(huì)生成一個(gè)spec文件(用于指定打包的配置),“-F”效果是打包成一個(gè)文件,“-w”則可以使打包后的程序運(yùn)行時(shí)不彈出黑窗口(在打包使用圖形界面庫(kù)的代碼,如tkinter、pyqt5、pygame時(shí)很有用)。“-i”后跟一個(gè)ico格式(其他格式會(huì)報(bào)錯(cuò))的圖標(biāo),則可以指定打包后程序的圖標(biāo)。“main.py”是你要打包程序的入口文件(其他被調(diào)用的文件會(huì)自動(dòng)導(dǎo)入)
執(zhí)行后如下圖所示


可以看到多出了一個(gè)“main.spec”文件(本質(zhì)上是txt文本文件,可用記事本打開(kāi),是實(shí)現(xiàn)默認(rèn)/個(gè)性化打包的文件)
我們用記事本打開(kāi),可以看到如下內(nèi)容

可以看到剛剛執(zhí)行的一些附加條件,如不顯示console,設(shè)置圖標(biāo)為favcon.ico等。而我們?cè)诖藛?wèn)題中需要關(guān)注的是“datas=[]”,這里可以指定打包的資源文件。
接下來(lái)在python主文件最前面加入下面的代碼
import os
import sys
# 資源文件目錄訪問(wèn)
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)
# 修改當(dāng)前工作目錄,使得資源文件可以被正確訪問(wèn)
cd = source_path('')
os.chdir(cd)

這段代碼的功能是,當(dāng)程序未打包時(shí),不改變當(dāng)前工作目錄;當(dāng)程序被pyinstaller打包成exe時(shí),則會(huì)將工作目錄修改為一個(gè)臨時(shí)文件夾"C:\Users\23121\AppData\Local\Temp_MEI172602",屆時(shí)打包好的程序會(huì)將資源文件都放到此處。
接下來(lái)我們解析“datas=[]”,此列表內(nèi)可以加入一個(gè)元組(注意,此元組最多可以有兩個(gè)元素)指定要打包的資源和打包后在臨時(shí)文件夾內(nèi)的文件夾名稱(chēng)。比如“datas=[(‘res’,‘.’)]”第一個(gè)res代表需要打包的文件夾名res,其內(nèi)部存放的全都是各種資源文件。第二個(gè)’.‘代表打包后在臨時(shí)文件中的文件夾名稱(chēng)。因?yàn)槲业某绦蛸Y源原本是存放在main.py的同級(jí)目錄的,所有這里不需要運(yùn)行后將資源釋放到指定的文件夾中,直接使用’.'即可。如本身被調(diào)用的資源就在一個(gè)二級(jí)文件夾“resoure”里,則修改為“datas=[(‘res’,‘resource’)]”。
下圖為修改后的main.spec

然后創(chuàng)建一個(gè)名為“res”的文件夾,將需要打包的資源全部放進(jìn)去(注意:不需要把程序圖標(biāo)也放進(jìn)去,“favicon.ico”必須放到“main.py”同級(jí)目錄,否則在打包時(shí)會(huì)提示找不到圖標(biāo)文件)


接下來(lái)回到剛剛的cmd窗口中執(zhí)行下面的命令
pyinstaller main.spec


可以看到已經(jīng)成功打包了。
這時(shí)會(huì)多出一個(gè)dist文件夾,我們打包好的程序就在里面。


現(xiàn)在程序已經(jīng)能獨(dú)立運(yùn)行了,我們運(yùn)行程序后看一下資源被釋放到的路徑:



可以看到資源全部被臨時(shí)釋放到這里了。關(guān)閉程序后再次嘗試進(jìn)入此文件夾:

可以發(fā)現(xiàn)我們的臨時(shí)文件夾被清除了。
至此,這篇關(guān)于pyinstaller如何打包多個(gè)資源文件的教程就結(jié)束了。
總結(jié)
到此這篇關(guān)于Pyinstaller打包多個(gè)資源文件的文章就介紹到這了,更多相關(guān)Pyinstaller打包多個(gè)資源文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 中獲取數(shù)組的子數(shù)組示例詳解
在 Python 中獲取一個(gè)數(shù)組的子數(shù)組時(shí),可以使用切片操作,使用切片操作來(lái)獲取一個(gè)數(shù)組的一段連續(xù)的子數(shù)組,并且還可以使用一些方便的語(yǔ)法來(lái)簡(jiǎn)化代碼,這篇文章主要介紹了如何在 Python 中獲取數(shù)組的子數(shù)組,需要的朋友可以參考下2023-05-05
Python有序字典簡(jiǎn)單實(shí)現(xiàn)方法示例
這篇文章主要介紹了Python有序字典簡(jiǎn)單實(shí)現(xiàn)方法,涉及Python使用OrderedDict方法進(jìn)行字典排序的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
PyCharm插件開(kāi)發(fā)實(shí)踐之PyGetterAndSetter詳解
這篇文章主要介紹了PyCharm插件開(kāi)發(fā)實(shí)踐-PyGetterAndSetter,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
Pytorch evaluation每次運(yùn)行結(jié)果不同的解決
今天小編就為大家分享一篇Pytorch evaluation每次運(yùn)行結(jié)果不同的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
使用Python開(kāi)發(fā)一個(gè)簡(jiǎn)單的本地圖片服務(wù)器
本文介紹了如何結(jié)合wxPython構(gòu)建的圖形用戶(hù)界面GUI和Python內(nèi)建的 Web服務(wù)器功能,在本地網(wǎng)絡(luò)中搭建一個(gè)私人的,即開(kāi)即用的網(wǎng)頁(yè)相冊(cè),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2025-04-04
詳解python的幾種標(biāo)準(zhǔn)輸出重定向方式
這篇文章是基于Python2.7版本,介紹常見(jiàn)的幾種標(biāo)準(zhǔn)輸出(stdout)重定向方式。顯然,這些方式也適用于標(biāo)準(zhǔn)錯(cuò)誤重定向。學(xué)習(xí)python的小伙伴們可以參考借鑒。2016-08-08
Python基于staticmethod裝飾器標(biāo)示靜態(tài)方法
這篇文章主要介紹了Python基于staticmethod裝飾器標(biāo)示靜態(tài)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
python實(shí)現(xiàn)RSA加密(解密)算法
RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn),下面通過(guò)本文給大家介紹python實(shí)現(xiàn)RSA加密(解密)算法,需要的朋友參考下2016-02-02
pd.DataFrame中的幾種索引變換的實(shí)現(xiàn)
本文主要介紹了pd.DataFrame中的幾種索引變換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

