之前學習了打包,今天學習下如何打包帶有資源的程式,
之前的教程鏈接:
python打包成exe 可執行檔案 ,教程
建立虛擬環境解決python打包exe檔案過大的問題(附打包帶圖示,多個py檔案打包exe)
今天講下如何將資源檔案一起打包,
開先我給程式中的添加資源那部分代碼,資源寫上絕對路徑,發現打包的exe可以運行,但是當我把資源檔案移動后,發現打包的exe不能運行,這肯定不行呀,意味著我們無法把exe給其他小伙伴,然后我嘗試啦下的新的方法,
第一步:建立虛擬環境,安裝相關庫
這部分參考
建立虛擬環境解決python打包exe檔案過大的問題(附打包帶圖示,多個py檔案打包exe)
第二步:建立資源檔案夾
基本原理:Pyinstaller 可以將資源檔案一起bundle到exe中,當exe在運行時,會生成一個臨時檔案夾,程式可通過sys._MEIPASS訪問臨時檔案夾中的資源
官方說明:https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation
第三步:修改.py檔案
修改hm_004.py中讀取資源資料路徑部分的代碼,
import sys
import os
#生成資源檔案目錄訪問路徑
def resource_path(relative_path):
if getattr(sys, 'frozen', False): #是否Bundle Resource
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
#訪問res檔案夾下資料.txt的內容
filename = resource_path(os.path.join("res","資料.txt"))
hm_004.py代碼如下
修改代碼后,hm_004.py代碼在pycharm等平臺無法運行成功,因為讀取路徑方法發生變化,這有什么關系呀,我們要的是打包exen能運行就可以,
#coding:utf-8
import sys
import os
#生成資源檔案目錄訪問路徑
def resource_path(relative_path):
if getattr(sys, 'frozen', False): #是否Bundle Resource
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
#訪問res檔案夾下資料.txt的內容
filename = resource_path(os.path.join("res","資料.txt"))
print(filename)
with open(filename,encoding='utf-8') as f:
lines = f.readlines()
print(lines)
f.close()
第四步:打包exe
結果會生成build,dist檔案夾和spec檔案,
第五步:洗掉build,dist檔案夾.修改spec
spec用記事本打開,首先打開一個記事本,然后把spec檔案拖進去即可,
修改前datas=[],本文這里把它改成下圖所示,意思是
將hm_004.py當前目錄下的res目錄(及其目錄中的檔案)加入目標exe中,在運行時放在零時檔案的根目錄下,名稱為res,

如果有多個資源
datas=[(‘res/bg.jpg’, ‘res’), (‘exam.db’, ‘.’)]
串列里面是元組,左邊是你要添加的filename(相對路徑即可),右邊是拷貝到專案中之后的檔案夾名字,
比如:(‘res/bg.jpg’, ‘res’) 中的 ‘res/bg.jpg’ 表示工程根目錄下res檔案夾下有bg.jpg圖片,拷貝到專案之后的res檔案夾,
(‘exam.db’, ‘.’) 中的’exam.db’是工程根目錄下的檔案,’.'表示根目錄,即拷貝到專案中的根目錄下,
仍然要注意資源路徑讀取方式,參考第三步,
第六步:再次打包exe
這次是打包spec檔案.
pyinstaller -F hm_004.spec
會再次生成build,dist檔案,沒有新生成spec啦
dist 檔案

第七步:運行exe
由于本文中的例子是一個簡單程式,非界面,如果直接點擊exe,會一閃而過,因為不是界面程式,如pyqt,
非界面,如何需要像運行python程式運行
cmd進入dist檔案夾,然后輸入程式名,回車.
結果如下:發現檔案路徑和原始資料.txt絕對路徑不一樣啦,

發送給其他小伙伴嘗試運行
我將res檔案洗掉,
并將dist檔案夾復制到桌面(如果是界面程式可以只復制exe)
桌面上的dist檔案,(這時我的電腦沒有任何資料.txt資源檔案啦,因為我已洗掉)

再次運行:

其他
由于現實生活中,我們的任務一般都很復雜,如涉及模型等,需要下載tensorflow等,
有些包太大,直接在虛擬環境下安裝不了,需要先下載到本地,在安裝,
教程鏈接:python 安裝第三方包
哪些打包步驟都如之前的教程,不同的是因為需要的包太多了,包與包之間不兼容,如打包需要keras庫,而Keras又需要tesorflow,打包程序中卻顯示tensorflow版本必須大于2.0,
包與包之間兼容的問題正是python的弊端,需要的時候自己慢慢除錯包吧,
sklearn模型打包講解
python打包exe 之打包sklearn模型中的各種坑及其解決方法,

電氣工程的計算機萌新:余登武,寫博文不容易,如果你覺得本文對你有用,請點個贊支持下,謝謝,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/123915.html
標籤:其他
上一篇:爬蟲開始路線
下一篇:Python編程 基礎練習(四)
