項(xiàng)目場(chǎng)景:
我寫了python程序,本地環(huán)境能正常運(yùn)行,我打算打包成exe文件
方便發(fā)給朋友,讓沒(méi)有python環(huán)境也能正常運(yùn)行
程序調(diào)用了wav文件,一個(gè)音效資源文件,程序調(diào)用的路徑如下:
file = "貓咪吃東西.wav"
問(wèn)題描述:
程序制作完成后,我開(kāi)始打包
在需要打包的程序的目錄上,我進(jìn)入終端輸入以下命令進(jìn)行打包:
pyinstaller -cF xxx.py --add-data="貓咪吃東西.wav;貓咪吃東西.wav" -n="xxx.exe"
完成打包后,我在dist目錄中找到生成的exe
運(yùn)行失敗直接閃退,我懷疑是缺少文件導(dǎo)致報(bào)錯(cuò)
為了捕捉原因,運(yùn)行程序添加如下代碼:
再次重復(fù)上述步驟進(jìn)行打包,運(yùn)行生成exe文件報(bào)錯(cuò)如下:
原因分析:
根據(jù)上面截圖,可以看到exe文件運(yùn)行失敗的原因
是在當(dāng)前目錄上運(yùn)行程序找不到所需資源wav文件
找不到資源文件導(dǎo)致的報(bào)錯(cuò),一般這種情況有兩個(gè)原因:
第一:打包的命令有問(wèn)題,沒(méi)有將資源文件打包進(jìn)去
第二:運(yùn)行程序的讀取資源文件有問(wèn)題,路徑問(wèn)題或者是權(quán)限問(wèn)題(可能性?。?/span>
解決方案:
根據(jù)上述兩個(gè)原因,制定兩個(gè)計(jì)劃:
第一:再運(yùn)行一次exe文件,查看生成的臨時(shí)文件夾有沒(méi)有資源文件
第二:查看臨時(shí)目錄的資源文件的路徑,確認(rèn)路徑與程序讀取文件路徑對(duì)應(yīng)
一、查看臨時(shí)文件夾
運(yùn)行exe后,不關(guān)閉運(yùn)行程序窗口就會(huì)出現(xiàn)想要的臨時(shí)文件夾
window系統(tǒng)運(yùn)行的程序生成的緩存文件,一般都在臨時(shí)文件Temp中
而pyinstaller打包生成的臨時(shí)文件在Temp中文件夾里一般是_ME開(kāi)頭的文件,例如:
二、修改打包命令,并打包
根據(jù)圖片可以發(fā)現(xiàn)程序所需資源文件和第三方庫(kù)的存在
但是路徑與與程序讀取文件的路徑不一樣
我們想要的只是wav文件,卻多了個(gè)目錄
了解pyinstaller打包命令后,發(fā)現(xiàn)錯(cuò)誤原因如下:
附加文件指定的路徑,不需要寫名稱
修改打包命令,終端輸入以下命令打包:
pyinstaller -cF xxx.py --add-data="貓咪吃東西.wav;." -n="xxx.exe"
打包生成exe的運(yùn)行后,依然報(bào)錯(cuò)如下:
三、修改運(yùn)行程序調(diào)用文件的路徑
打包的exe文件讀取資源時(shí)的路徑需要采用絕對(duì)路徑
在運(yùn)行程序中我添加了一些輸出,具體原因你可以看截圖:
根據(jù)截圖你會(huì)發(fā)現(xiàn)
如果你寫的是相對(duì)路徑,那么程序?qū)ふ业馁Y源路徑與正確路徑不一致
運(yùn)行exe所在的目錄就是工作目錄,他會(huì)在當(dāng)前目錄尋找資源文件
所以說(shuō)讀取文件路徑需要先獲取臨時(shí)工作目錄加上資源所在路徑
修改運(yùn)行程序的路徑,代碼如下:
# 獲取目錄路徑對(duì)象
SRC_PATH = Path.absolute(Path(__file__)).parent
# 吃食物聲音路徑:
path = str(SRC_PATH / "貓咪吃東西.wav") # 拼接獲得文件絕對(duì)路徑字符串
修改完程序后,終端再次輸入命令打包:
pyinstaller -cF xxx.py --add-data="貓咪吃東西.wav;." -n="xxx.exe"
完成打包后,成功運(yùn)行生成的exe,功能也是完整的
總結(jié)
也許朋友pyinstaller打包的exe報(bào)錯(cuò)的原因與我不同,但是朋友也可以根據(jù)以下步驟尋找答案:
1、首先程序中添加異常報(bào)錯(cuò)說(shuō)明
2、確認(rèn)是無(wú)法找到資源文件導(dǎo)致的報(bào)錯(cuò)后,查看臨時(shí)文件夾
3、查看臨時(shí)文件夾的資源文件跟運(yùn)行程序讀取文件的路徑一致嗎
4、確認(rèn)自己的運(yùn)行程序讀取文件路徑是絕對(duì)路徑(臨時(shí)工作目錄加上資源文件的所在的路徑)
5、看看臨時(shí)工作目錄與下列代碼獲取的值一樣嗎? ??文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-835750.html
# 獲取目錄路徑對(duì)象
SRC_PATH = Path.absolute(Path(__file__)).parent
# 吃食物聲音路徑:
path = str(SRC_PATH / "貓咪吃東西.wav") # 拼接獲得文件絕對(duì)路徑字符串
????????如果還是解決不了問(wèn)題的話,可以評(píng)論區(qū)聯(lián)系我文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-835750.html
到了這里,關(guān)于python pyinstaller打包常見(jiàn)問(wèn)題(二):No file找不到文件解決辦法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!