用Pyinstaller进行打包exe时,有时候得附带上一些资源,提高程序的实用性和人性化。 在网上也有很多把依赖文件打包进exe的方法,不过都只能打包一些图片或者文本而已。 另一种方法是通过修改PyInstaller配置文件*.spec来实现打包的方法,虽然挺不错,但是似乎不能移植到其他设备上。所以我翻阅文献后,查找到两种方式:NSIS程序和base64数据。
参考文献:
https://blog.csdn.net/COLDRAIN_END/article/details/104385472
https://blog.csdn.net/qq_51523386/article/details/112122852
请先安装pyinstaller库、NSIS软件。
pip install pyinstaller
这种方法的原理是将附属文件转换成base64的格式,在需要时解压到目录中。(注:base64所支持的文件类型不限于图片)
1.准备好你所需要打包的所有文件,放在同一文件夹内。
2.依次将所有文件(不包括文件夹)放入下列网站转换为base64数据。
https://www.giftofspeed.com/base64-encoder/
https://www.zhangxinxu.com/sp/base64.html
3.将获取到的数据粘贴到一个py文件中,用来存储数据。
#这里每个键对应每个文件及其所在位置
#例如Demo3和Demo4都带上了pic文件前缀,值对应base64数据
#注意这里不要有换行,我这里文件数据太大就省略了一部分
dic = {
'Demo1.zip':'UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==',
'Demo2.html':'RGVtbzIuaHRtbA==',
'pic/Demo3.png':'RGVtbzMucG5n',
'pic/Demo4.ico':'RGVtbzQuaWNv'
}
4.调用数据的程序。
dic = {
'Demo1.zip':'UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==',
'Demo2.html':'RGVtbzIuaHRtbA==',
'pic/Demo3.png':'RGVtbzMucG5n',
'pic/Demo4.ico':'RGVtbzQuaWNv'
}
import os
import base64
def write_file(data, route):
get_file = base64.b64decode(data) # 将base64数据进行解析
with open(route, 'wb') as a: # 输出文件到指定位置
a.write(get_file)
#-----调用函数,传入对应的 base64数据 和 输出文件的位置,生成依赖的资源文件-----#
for i in dic:
try:
path = os.path.split(os.path.realpath(i))[0]
os.makedirs(path)
except:None
write_file('%s' % dic[i], i)
在cmd中输入
pyinstaller -F -w main.py
#-F:打包后只生成单个exe格式文件;-w:不使用控制台
#别忘了定位到当前目录
关于打包exe的更多事宜,可见Pyinstaller打包py文件。
这个方法适用于几乎所有格式的文件(文件夹除外),而且程序不用安装可以直接使用,但写程序需要将一个一个文件都写进去,文件一大就容易卡顿,会较为麻烦费时。
main.py
from PIL import Image,ImageTk
import tkinter as tk
# 简单插入显示
def show_jpg():
root = tk.Tk()
root.geometry('500x500')
with open('Demo1.txt') as o:
k = o.readlines()[0]
def fuction():
root1 = tk.Toplevel()
im=Image.open('Demo3.jpg')
img=ImageTk.PhotoImage(im)
tk.Label(root1,image=img).pack()
root1.mainloop()
tk.Button(text=k,command=lambda:fuction()).pack(fill='x')
im=Image.open('Demo2.jpg')
img=ImageTk.PhotoImage(im)
tk.Label(root,image=img).pack()
root.mainloop()
if __name__ == '__main__':
show_jpg()
注意:这种方法在资源文件夹中不能有别的文件夹,如果真的想要分类的话,可以找到这张图,运行一个将资源分类的程序。
1.安装并打开NSIS软件。
2.Ctrl+W新建脚本向导。
3.点击下一步,填写程序的对应信息。
4.点击下一步,自主修改(语言建议添加英语)。
5.点击下一步,下一步(中间的自主修改),删除授权文件。
6.点击下一步,删除默认文件。
7.添加已经打包的exe源文件。
8.添加附属文件资源包。
9.建议单独添加每个子文件。
10.点击下一步,下一步,下一步,下一步(中间的自主修改),勾选保存脚步和转换文件路径到相对路径。
11.点击完成,并保存脚本。
12.运行脚本。
最后就会在桌面上找到一个Setup的exe。
运行就会开始安装程序,我们的打包也结束了。
与原作者所说不同,这种方法可以适用于所有exe文件,而且可以附带很多资源,而且也不会太卡顿,但是资源文件夹里不能放别的文件夹,这也是它的弊端,而且作为一个安装包,它似乎不可以访问注册表。下一篇文章我会着手于用python自制一个安装包软件。