其他 Pyinstaller 打包技巧见《Python程序打包指南》
Pyinstaller 不仅可以打包
.py
文件为exe
,还可以将依赖的其他资源文件(如图片、音频等媒体文件)也打包到程序中。pyinstaller 支持两种打包模式,一种是单文件的exe,适合功能简单,体积小的程序;另一种是打包为文件夹,里边包含一个 exe 可以执行。平时我们见到的绿化程序很多都属于是单文件程序,比如我们写了一个小脚本,寥寥数行代码,打包成一个文件夹显然不方便分享,这就可使用
Pyinstaller
打包成一个exe
,便于传发。本文使用的环境为:Win11 X64 、Python 3.8.x 、Pyinstaller 4.9
本文主要介绍四部分:1. 如何使用 pyinstaller 打包
.py
文件为 exe; 2. 如何生成单文件 exe; 3.如何去掉命令行窗口; 4. 如何打包其他资源文件,如图片、文件夹等
文章目录
-
- 一、将 .py 文件打包为 exe
-
- 1.1、打包命令
- 1.2、命令解析
- 1.3、示例演示
- 二、打包单为文件
-
- 2.1、打包命令
- 2.2、命令解析
- 2.3、示例演示
- 三、去掉命令行窗口
-
- 3.1、设置参数
- 3.2、设置效果如下
- 3.3、命令行窗口在调试中的作用
- 四、打包组资源文件
-
- 4.1、Spec文件分析
- 4.2、Spec文件修改实现打包资源文件
- 4.3、重新打包:
- 4.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部分:Analysis
、PYZ
、EXE
、COLLECT
- 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
文件将图片打包进去??:
这时可以删掉build
,dist
文件夹,这两个没用了,一会要重新生成。然后我们修改test.spec
文件,记事本或者VSC打开即可:
重点修改详解??:
- (‘./ico.png’,‘.’):表示将
ico.png
复制到打包目录的根目录下(.
表示根目录) - (‘asset’,‘asset1’):表示将
asset
文件夹,复制到打包目录asset1
目录下。
重新打包,同时打包资源文件??:
运行命令pyinstaller -D xx.spec
,可以看到,我们设置的都打包进来了:
运行效果如下??:
可以看出,完全正常!!至此,Pyinstaller 打包我们就讲述完毕了,有问题的小伙伴欢迎留言讨论。