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

将python打包成exe文件(携带附属文件),第1张

前言

用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.准备好你所需要打包的所有文件,放在同一文件夹内。

2.依次将所有文件(不包括文件夹)放入下列网站转换为base64数据。
http://www.kaotop.com/file/tupian/20220427/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)
包装成exe文件

在cmd中输入

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

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

成品


dist里的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()
预览运行:

附属文件:

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

注意:这种方法在资源文件夹中不能有别的文件夹,如果真的想要分类的话,可以找到这张图,运行一个将资源分类的程序。

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

1.安装并打开NSIS软件。


2.Ctrl+W新建脚本向导。
3.点击下一步,填写程序的对应信息。

4.点击下一步,自主修改(语言建议添加英语)。

5.点击下一步下一步(中间的自主修改),删除授权文件。
6.点击下一步,删除默认文件。

7.添加已经打包的exe源文件。

8.添加附属文件资源包。

9.建议单独添加每个子文件。

10.点击下一步下一步下一步下一步(中间的自主修改),勾选保存脚步转换文件路径到相对路径

11.点击完成,并保存脚本。

12.运行脚本。

最后就会在桌面上找到一个Setup的exe。

运行就会开始安装程序,我们的打包也结束了。

小结

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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/738575.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-28
下一篇2022-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存