【Python】详解打包代码为可执行文件.exe(pyinstaller模块)
详解使用pyinstaller模块打包.py文件为.exe可执行文件的相关知识,同时还介绍了如何降低pyinstaller打包后的可执行文件大小
为什么要打包.py为.exe文件?
我们在编写代码时依赖的是本地环境,使用的是本地代码编译器。我们可以设想一种情况:当我们做好一个脚本或者工具,想要给其他人用,这个时候还需要在别人的电脑上装好python环境和编译器吗?那肯定比较麻烦,最快捷的方式就是将本地的.py文件直接打包成.exe的可执行文件,这样在任何电脑上只需要点击可执行文件那么代码就可以运行。
在python中,最常用的打包方式就是使用pyinstaller包,接下来我将详细介绍其用法~
1.打包机制
类似我们在本地使用编译器进行代码运行,打包时会将编译器进行打包。同时我们写的代码所依赖的所有包都会被一同打包,为了防止漏打包的情况,pyinstaller进行打包时往往可能会多打包而基本不会漏打。
2.安装pyinstaller包
首先我们需要使用pip安装pyinstaller模块,在终端中输入:
pip install pyinstaller
3.基本用法和参数介绍
打开编译器终端(terminal),使用pyinstaller语句对py文件进行打包,最基础的打包语句如下:
pyinstaller -F xxx.py
语句中xxx.py指的是需要打包的.py文件名,打包完之后可以在项目文件的dist文件夹中找到.exe可执行文件。
加入-w可以关闭点击exe文件后启动的黑色控制台,如下:
pyinstaller -F -w xxx.py
此外pyinstaller还有其他可选的参数,如果我们想要改变.exe可执行文件的图标可以使用以下语句:
pyinstaller -F -w -i xxx.ico xxx.py
其中xxx.ico的位置是ico类型文件的名称,可以填写ico图标的路径或者把ico图标放在和.py文件相同的文件夹下,才可顺利打包,推荐两个ico图标相关的网站:
ico图标在线转换工具https://ico.nyaasu.top/
阿里巴巴矢量库https://www.iconfont.cn/?spm=a313x.search_index.i3.d4d0a486a.350c3a81r6W4KE
类似的还可以把-F替换成其他参数,参考下表:
参数 | 描述 |
-F | 只会打包为一个单独的.exe文件,所有的依赖包括库之类的全部都被打包进exe文件(单文件模式) |
-D | 打包后会产生一个.exe文件和其依赖文件的文件夹(多文件模式) |
-C | 产生一个黑色控制台(默认)调试时常常需要使用 |
-w | 隐藏黑色控制台,一般是在写一个GUI应用时使用,只显示GUI窗口而隐藏控制台 |
-i 或 -icon | 将可执行文件的图标改成指定的ico图标 |
-n | 重命名.exe文件的名称 |
--splash | 添加启动文件画面图,用于等待加载 |
通用打包语句如下,大家可以按自己需求删改:
pyinstaller -F -w xxx.py -i xxx.ico -n xxx --splash xxx.png
四个xxx的位置中第一个是当前.py文件的文件名,第二个是ico图标的文件名,第三个是要重命名的名称,第四个是启动图片名称,默认把所有相关图片都放在与py文件同一个文件夹下,也可以使用图片文件的绝对路径引用。
4.用法演示:
如下图,我们准备好三个文件,分别是.py文件,ico图标文件和png加载图片的文件。
在终端中输入如下指令:
pyinstaller -F -w test.py -i money.ico -n test_rename --splash img.png
按照我们的预想,应该生成一个带ico图标的在,单文件的,无黑色控制台的,名称为test_rename的.exe可执行文件,同时在启动时,还会有一个加载图片动画img.png。
打包完成后的情况的确如此:
主文件夹中会生成一个build文件夹,一个dist文件夹,一个spec文件,dist文件夹中存有.exe文件,其为单文件模式,exe文件中打包了所有依赖库,可以直接拿来使用
5.如何降低打包文件大小
在我们使用pyinstaller模块直接对.py文件进行打包时,常常会发现打包出来的文件异常的大,尤其是当代码中需要使用到numpy,pandas,pyside这种大型库,打包出来的文件往往可能达到百兆大小的级别,因此如何降低打包出来的文件大小是非常重要的,我整合了网上的一些方法,结合了一些自己的理解,提供给大家参考。
(1)在虚拟环境中打包
直接使用pyinstaller打包时,可能会把其所有可能用到的包和依赖项全部打包,有些时候我们可能没有用到某个包,但是也import了,就会导打包文件偏大。此时若我们创建一个全新的虚拟环境,打包出来的效果可能会更好,包大小也可能会显著减小。
安装pipenv环境:
pip install pipenv
在虚拟环境中安装python,不指定版本则会默认安装:
pip install
进入虚拟环境:
pipenv shell
在虚拟环境中安装要用到的各种包:
pip install xxx
查看当前虚拟环境中包的数量:
pip list
确认需要的所有包都安装完成后,再使用前面的方法进行打包操作:
pyinstaller -F xxx.py
(2)使用UPX压缩降低打包文件大小
upx (the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70% ,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用(百度百科)
虽然话是这么说,但实际上在使用时往往会发现UPX可能只能减少很有限的大小,还是需要去尝试一下看看效果。
pyinstaller在进行打包时自动会检测调用UPX,一般情况下UPX是缺失的,需要我们手动下载。在使用pyinstaller进行打包时指定其目录即可,例如下载到E盘,E:\UPX,在打包时的语句如下:
pyinstaller -F -i xxx.ico xxx.py --upx-dir E:\UPX\
UPX的官方下载网站如下:
点击打开UPX下载网站https://upx.github.io/
当然,以上只是两种主流解决办法,网络上还有很多方法,例如使用pyinstaller的docker镜像打包,如果使用上述两种方法没有解决问题的话还可以去网上查阅。
6.问题记录
使用pyinstaller打包时报毒(2024/5/31)
今天在打包时发现被防火墙拦截了,使用的是pyinstaller -F -w xxx.py的语句,经检查发现使用-w去除控制台后才会被拦截,如果不使用-w,使用pyinstaller -F 的语句就不会报毒;还有一种方式是去尝试或降低版本,可能就能够解决这个问题。
想要了解更多,可以查阅官方中文文档:
Pyinstaller中文文档https://muzing.gitbook.io/pyinstaller-docs-zh-cn
后续也会分享更多有用的知识,有什么问题都可以在评论区中指出来,感谢各位支持!
更多推荐
所有评论(0)