将python打包成exe文件(携带附属文件)

前言

用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的格式,在需要时解压到目录中。(注:base64所支持的文件类型不限于图片)

1.准备好你所需要打包的所有文件,放在同一文件夹内。
《将python打包成exe文件(携带附属文件)》
2.依次将所有文件(不包括文件夹)放入下列网站转换为base64数据。
https://www.giftofspeed.com/base64-encoder/
https://www.zhangxinxu.com/sp/base64.html
《将python打包成exe文件(携带附属文件)》

在程序中调用数据并创建文件

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)

包装成exe文件

在cmd中输入

pyinstaller -F -w main.py
#-F:打包后只生成单个exe格式文件;-w:不使用控制台
#别忘了定位到当前目录

关于打包exe的更多事宜,可见Pyinstaller打包py文件

成品

《将python打包成exe文件(携带附属文件)》
dist里的exe执行就能出现文件了《将python打包成exe文件(携带附属文件)》

小结

这个方法适用于几乎所有格式的文件(文件夹除外),而且程序不用安装可以直接使用,但写程序需要将一个一个文件都写进去,文件一大就容易卡顿,会较为麻烦费时

方法二:NSIS软件

准备工作

例子

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()

预览运行:

《将python打包成exe文件(携带附属文件)》

附属文件

《将python打包成exe文件(携带附属文件)》

将文件放入一个空文件夹里(等会打包需要用)。

注意:这种方法在资源文件夹中不能有别的文件夹,如果真的想要分类的话,可以找到这张图,运行一个将资源分类的程序。《将python打包成exe文件(携带附属文件)》

《将python打包成exe文件(携带附属文件)》

将主程序的代码打包成exe文件(仅限主文件),可以回看前文。

编译安装包

1.安装并打开NSIS软件。

《将python打包成exe文件(携带附属文件)》
2.Ctrl+W新建脚本向导。《将python打包成exe文件(携带附属文件)》
3.点击下一步,填写程序的对应信息
《将python打包成exe文件(携带附属文件)》
4.点击下一步,自主修改(语言建议添加英语)。
《将python打包成exe文件(携带附属文件)》
5.点击下一步下一步(中间的自主修改),删除授权文件《将python打包成exe文件(携带附属文件)》
6.点击下一步删除默认文件
《将python打包成exe文件(携带附属文件)》
7.添加已经打包的exe源文件
《将python打包成exe文件(携带附属文件)》
8.添加附属文件资源包
《将python打包成exe文件(携带附属文件)》
9.建议单独添加每个子文件
《将python打包成exe文件(携带附属文件)》
10.点击下一步下一步下一步下一步(中间的自主修改),勾选保存脚步转换文件路径到相对路径
《将python打包成exe文件(携带附属文件)》
11.点击完成,并保存脚本。
《将python打包成exe文件(携带附属文件)》
12.运行脚本。
《将python打包成exe文件(携带附属文件)》
最后就会在桌面上找到一个Setup的exe。
《将python打包成exe文件(携带附属文件)》
运行就会开始安装程序,我们的打包也结束了。

小结

与原作者所说不同,这种方法可以适用于所有exe文件,而且可以附带很多资源,而且也不会太卡顿,但是资源文件夹里不能放别的文件夹,这也是它的弊端,而且作为一个安装包,它似乎不可以访问注册表。下一篇文章我会着手于用python自制一个安装包软件。

    原文作者:R_I_P_Avicii
    原文地址: https://blog.csdn.net/R_I_P_Avicii/article/details/124329597
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞