欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python将资源文件一起打包进exe 讲解(有算例)

程序员文章站 2022-06-17 14:52:31
...

之前学习了打包。今天学习下如何打包带有资源的程序。
之前的教程链接:
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

python将资源文件一起打包进exe 讲解(有算例)python将资源文件一起打包进exe 讲解(有算例)

第三步:修改.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文件。

python将资源文件一起打包进exe 讲解(有算例)

第五步:删除build,dist文件夹.修改spec
spec用记事本打开。首先打开一个记事本,然后把spec文件拖进去即可。
修改前datas=[],本文这里把它改成下图所示,意思是

将hm_004.py当前目录下的res目录(及其目录中的文件)加入目标exe中,在运行时放在零时文件的根目录下,名称为res。
python将资源文件一起打包进exe 讲解(有算例)

如果有多个资源

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
python将资源文件一起打包进exe 讲解(有算例)

会再次生成build,dist文件。没有新生成spec啦

python将资源文件一起打包进exe 讲解(有算例)

dist 文件
python将资源文件一起打包进exe 讲解(有算例)

第七步:运行exe
由于本文中的例子是一个简单程序,非界面,如果直接点击exe,会一闪而过,因为不是界面程序,如pyqt。
非界面,如何需要像运行python程序运行
cmd进入dist文件夹,然后输入程序名,回车.

结果如下:发现文件路径和原始数据.txt绝对路径不一样啦。
python将资源文件一起打包进exe 讲解(有算例)

发送给其他小伙伴尝试运行
我将res文件删除。
并将dist文件夹复制到桌面(如果是界面程序可以只复制exe)
桌面上的dist文件,(这时我的电脑没有任何数据.txt资源文件啦,因为我已删除)
python将资源文件一起打包进exe 讲解(有算例)

再次运行:
python将资源文件一起打包进exe 讲解(有算例)

其他

由于现实生活中,我们的任务一般都很复杂,如涉及模型等。需要下载tensorflow等。
有些包太大,直接在虚拟环境下安装不了,需要先下载到本地,在安装。
教程链接:python 安装第三方包

哪些打包步骤都如之前的教程。不同的是因为需要的包太多了,包与包之间不兼容。如打包需要keras库,而Keras又需要tesorflow,打包过程中却显示tensorflow版本必须大于2.0。
包与包之间兼容的问题正是python的弊端。需要的时候自己慢慢调试包吧。

python将资源文件一起打包进exe 讲解(有算例)

电气工程的计算机萌新:余登武。写博文不容易。如果你觉得本文对你有用,请点个赞支持下,谢谢。

python将资源文件一起打包进exe 讲解(有算例)