Pyinstaller 生成 exe 及打包资源文件

其他 Pyinstaller 打包技巧见《Python程序打包指南


Pyinstaller 不仅可以打包 .py 文件为 exe ,还可以将依赖的其他资源文件(如图片、音频等媒体文件)也打包到程序中。

pyinstaller 支持两种打包模式,一种是单文件的exe,适合功能简单,体积小的程序;另一种是打包为文件夹,里边包含一个 exe 可以执行。平时我们见到的绿化程序很多都属于是单文件程序,比如我们写了一个小脚本,寥寥数行代码,打包成一个文件夹显然不方便分享,这就可使用Pyinstaller打包成一个exe,便于传发。

本文使用的环境为:Win11 X64Python 3.8.xPyinstaller 4.9

本文主要介绍四部分:1. 如何使用 pyinstaller 打包 .py文件为 exe; 2. 如何生成单文件 exe; 3.如何去掉命令行窗口; 4. 如何打包其他资源文件,如图片、文件夹等

一、将 .py 文件打包为 exe

这部分主要讲打包py文件的常用命令和方法,同时附带演示代码和演示效果以及命令解析。

1.1、打包命令

# 将 xx.py 打包
pyinstaller xx.py

默认就是以文件夹形式打包,会生成一个 build 文件夹dist 文件夹 ​pyinstaller -D xx.py命令效果相同,具体演示效果见下文示例演示

1.2、命令解析

xx.py表示代码文件名为 xx.py,-D表示打包为文件夹

1.3、示例演示

示例代码⬇️:

# 先安装 pip install pysimplegui
import PySimpleGUI as sg  

layout = [
	[sg.Text('请输入内容:')],  
	[sg.InputText()],  
	[sg.Submit('确认'), sg.Cancel('取消')]
] 

window = sg.Window('Demo示例', layout)  

event, values = window.read()   

text_input = values[0]  
sg.popup('你输入了:', text_input)

执行打包⬇️:

运行打包命令pyinstaller -D test.py,最后提示... completed successfully就是成功了,别的不认识也没关系。
在这里插入图片描述

打包效果如下⬇️:

我们可以清楚的看到test.py的同级目录下生成了build文件夹dist文件夹test.spec文件⬇️。dist文件夹下和xx.py文件同名的文件夹,这个就是我们打包出来的程序文件夹;而 build文件夹 是程序打包时构建过程生成的,我们无法直接使用,对于我们来讲没什么用,而test.spec文件是打包的中间配置文件,下边第四部分,我们通过修改这个文件来实现资源文件的打包。
在这里插入图片描述

dist文件夹即是我们程序打包好的文件夹,可以将这个文件夹分享给其他人,点击文件夹内的test.exe就可以运行程序,具体效果如下⬇️:
在这里插入图片描述

可以看的出来,完全没有问题!!!至此,我们就完成了程序的打包。

二、打包单为文件

在实际的应用中,有时候我们需要制作一些小工具,为了方便分发,常常打包为一个单文件的exe,这时候就需要使用-F参数。本小节主要讲解如何打包单文件exe,附带演示代码和效果以及命令解析,具体用法和效果如下:

2.1、打包命令

pyinstaller -F xx.py

2.2、命令解析

-F表示打包为单文件xx.py表示代码文件名为xx.py

2.3、示例演示

示例代码⬇️:

这里我们编写一个示例代码,我就直接引用我的另一篇博文《Python GUI-PySimplegui》中的代码来编写一个GUI程序

# 先安装 pip install pysimplegui
import PySimpleGUI as sg  

layout = [
	[sg.Text('请输入内容:')],  
	[sg.InputText()],  
	[sg.Submit('确认'), sg.Cancel('取消')]
] 

window = sg.Window('Demo示例', layout)  

event, values = window.read()   

text_input = values[0]  
sg.popup('你输入了:', text_input)

这个程序的实际运行效果是这样的⬇️:
在这里插入图片描述

执行打包⬇️:

接下来我们开始打包,运行打包命令pyinstaller -F test.py

打包效果如下⬇️:
双击运行一下试试看
在这里插入图片描述
运行成功!!!说明我们打包成功了。最后看一下文件属性,大小约10M
在这里插入图片描述

其实单文件的 exe 在执行的时候也是需要释放资源文件的,不过是释放在了系统默认的缓存位置,如果是软件稍复杂,那么打开就比较慢😑,这时候就不适合打包成单文件程序,而是打包为一个文件夹。

三、去掉命令行窗口

双击运行test.exe时,后边会出现一个黑框,也就是命令行,如果是GUI程序,我们就是需要去掉,不然那体验就太糟糕了😑。本小节主要讲解如何去掉这个黑窗口,同时讲解如何利用命令行窗口辅助调试程序,附带演示代码和效果以及命令解析

3.1、设置参数

可以通过添加w参数去掉黑乎乎的命令行窗口,在-F命令后增加w即可(-F-w参数一起使用的话,应为-Fw,而不是-F -w
假设之前打包的命令是pyinstaller -F xxx.py,现在改为pyinstaller -Fw xxx.py即可

3.2、设置效果如下

在这里插入图片描述

可以看到,命令行窗口就隐藏掉了(这里因为我的系统主题设置的黑色,所以动图那么显眼,对比上一张图可以看出是隐藏掉了)

3.3、命令行窗口在调试中的作用

在我们正式打包之前,需要打包测试是否可以正常运行,这时候需要保留命令行窗口来辅助调试。这个窗口可以输出调试的信息:
例如我们在示例代码中加入打印输入内容的语句

print('#>>:'+values[0])

完整代码如下⬇️:

# 先安装 pip install pysimplegui
import PySimpleGUI as sg  

layout = [
	[sg.Text('请输入内容:')],  
	[sg.InputText()],  
	[sg.Submit('确认'), sg.Cancel('取消')]
] 

window = sg.Window('Demo示例', layout)  

event, values = window.read()   

text_input = values[0]   
 
print('#>>:'+values[0])

sg.popup('你输入了:', text_input)

演示效果如下⬇️:
在这里插入图片描述

在测试完成没有问题后,即可增加w参数重新打包!!再分发给其他小伙伴。

四、打包组资源文件

有时候我们需要在打包的程序中调用一些资源文件,但是 pyinstaller 并不会自动的帮我们打包进去,每次都得手动复制进去,比较麻烦😡.其实可以配置 pyinstaller 让他打包的时候自动复制进去,这时候就需要我们手动去更改.spec文件了。本小节主要介绍如何修改.spec文件来实现自动打包资源文件,附带演示代码和效果以及命令解析。

4.1、Spec文件分析

细心的小伙伴可能发现,打包的时候,程序同路径下会生成一个同名的.spec文件,这个文件是打包的 “中间文件”,我们可以通过修改这个文件来添加需要添加资源的文件。

.spec文件中主要包含4部分:AnalysisPYZEXECOLLECT

  • Analysis:主要是分析 py 文件的依赖信息
  • PYZ:是一个.pyz的压缩包,包含程序运行需要的依赖
  • EXE:是根据上述两项内容而生成的
  • COLLECT:主要是输出信息

这里放一个spec文件的Analysis部分截取作为示例:

# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
             ......
             datas=[],
             ......
             )

4.2、Spec文件修改实现打包资源文件

想要添加资源文件,重点是修改datas的内容,我这里是修改过的,一般是空的:datas = []
datas ​里边的元素是以元组的形式来存储的,有这么一个映射关系:

datas = [('源文件路径','目标路径')]

如果有多个文件需要拷贝到程序中,就多写几个元组,记得映射关系不要搞错,有一点比较特殊:如果目标路径打包后的根目录,那就写.,这里讲的比较抽象,可以看下边的示例演示

4.3、重新打包:

重新运行打包命令pyinstaller -D xx.spec即可,不过这里后的对象不再是xx.py文件,而是xx.spec文件。

4.4、示例演示

示例代码⬇️:
代码我们依旧使用test.py,稍加修改:

import PySimpleGUI as sg  

layout = [
	[sg.Image('./ico.png')],  # 加载根目录下的图片      
	[sg.Submit('确认'), sg.Cancel('取消')]
] 

window = sg.Window('Demo示例', layout)  

event, values = window.read()   

现在的目录结构现在是这样的:
在这里插入图片描述

先运行一下,可以看到程序没问题是,可以加载到图片的:
在这里插入图片描述

接下来我们先运行打包命令,为了让他先生成.spec文件:

pyinstaller -D -w test.py

试运行⬇️:

我们可以尝试运行一下生成的test.exe,看程序是否运行正常:
在这里插入图片描述

可以看到,我们的程序在挠头,提示无法加载到./ico.png文件,这是因为ico.png文件没有一起打包到程序目录下

修改test.spec文件将图片打包进去⬇️:

这时可以删掉builddist文件夹,这两个没用了,一会要重新生成。然后我们修改test.spec文件,记事本或者VSC打开即可:
在这里插入图片描述

重点修改详解⬇️:

  • (‘./ico.png’,‘.’):表示将ico.png复制到打包目录的根目录下(.表示根目录)
  • (‘asset’,‘asset1’):表示将asset文件夹,复制到打包目录asset1目录下。

重新打包,同时打包资源文件⬇️:

运行命令pyinstaller -D xx.spec,可以看到,我们设置的都打包进来了:
在这里插入图片描述

运行效果如下⬇️:
在这里插入图片描述

可以看出,完全正常!!至此,Pyinstaller 打包我们就讲述完毕了,有问题的小伙伴欢迎留言讨论。

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YumOS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值