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

之前学习了打包。今天学习下如何打包带有资源的程序。
之前的教程链接:
python打包成exe 可执行文件 。教程
使用pipenv建立虚拟环境解决python打包exe文件过大的问题(附打包带图标,多个py文件打包exe)

今天讲下如何将资源文件一起打包。

开先我给程序中的添加资源那部分代码,资源写上绝对路径。发现打包的exe可以运行,但是当我把资源文件移动后,发现打包的exe不能运行,这肯定不行呀,意味着我们无法把exe给其他小伙伴。然后我尝试啦下的新的方法。
第一步:建立虚拟环境,安装相关库
这部分参考
使用pipenv建立虚拟环境解决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模型中的各种坑及其解决方法。

深度学习模型打包教程
python打包exe之打包深度学习模型踩坑记录及其解决办法。
在这里插入图片描述

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

在这里插入图片描述

  • 57
    点赞
  • 267
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总裁余(余登武)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值