python將資原始檔一起打包進exe 講解(有算例)

2020-09-23 14:00:24

之前學習了打包。今天學習下如何打包帶有資源的程式。
之前的教學連結:
python打包成exe 可執行檔案 。教學
建立虛擬環境解決python打包exe檔案過大的問題。

今天講下如何將資原始檔一起打包。

開先我給程式中的新增資源那部分程式碼,資源寫上絕對路徑。發現打包的exe可以執行,但是當我把資原始檔移動後,發現打包的exe不能執行,這肯定不行呀,意味著我們無法把exe給其他小夥伴。然後我嘗試啦下的新的方法。
第一步:建立虛擬環境,安裝相關庫
這部分參考
建立虛擬環境解決python打包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的弊端。需要的時候自己慢慢偵錯包吧。

在這裡插入圖片描述

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

在這裡插入圖片描述