41. 程序打包发布
一、Pyinstaller模块
我们编写的 Python 程序需要借助 Python 解释器才能运行。因此,其他人运行 Python 程序,也需要安装 Python 解释器才行。此时,我们可以将 Python 的源代码打包成可以双击运行的程序。在 Python 中没有内置可以直接打包程序的模块,我们可以借助第三方模块 Pyinstaller 模块来实现打包功能。
我们可以在终端中使用 pip
安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip
指令后通过 -i
指定国内镜像源下载。
pip install pyinstaller -i https://mirrors.aliyun.com/pypi/simple
国内常用的 pip
下载源列表:
- 阿里云 https://mirrors.aliyun.com/pypi/simple
- 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
- 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
- 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple
PyInstaller 有多文件打包和单文件打包两种模式。前者打包程序后输出多个文件并将其放入一个文件夹中,后者只输出一个可执行文件。
二、打包成多个文件
pyinstaller -D -w --icon="图标文件.ico" 启动文件.py -n 打包文件名
其中,-D
表示打包成 多个文件,打包的程序会在当前项目下的【dist】文件夹中,-w
表示 窗口程序,即双击运行程序时,不会弹出命令行,--icon
表示打包成可运行程序的 图标,图标文件要使用 .ico
类型的图标文件,-n
表示 打包文件名。
打包结束后,该工程文件夹下出现了【build】和【dist】两个文件夹,以及一个【.spec】文件。【build】文件夹中 存放着一些编译文件,可以直接删除。【.spec】是一个 打包配置文件。【dist】文件夹中有一个【打包文件名】文件夹,在里面我们可以发现一个【打包文件名.exe】可执行文件。双击【打包文件名.exe】,就可以双击运行。
如果程序中我们加载了一些资源文件,我们可以将需要的资源文件拷贝到【dist】文件夹下的【打包文件名】文件夹。
三、打包成单个文件
pyinstaller -F -w --icon="图标文件.ico" --add-data=资源文件所在的路径;打包后资源文件所在的路径 启动文件.py -n 打包文件名
其中,-F
表示打包成 单个文件,打包的程序会在当前项目下的【dist】文件夹中,-w
表示 窗口程序,即双击运行程序时,不会弹出命令行,--icon
表示打包成可运行程序的 图标,图标文件要使用 .ico
类型的图标文件,-n
表示 打包文件名,--add-data
将资源文件被打包进【打包文件名.exe】文件中。
使用单文件打包模式打包后,【dist】文件夹中只会生成一个【打包文件名.exe】可执行文件,全部的依赖文件都已经被打包到这个文件中了。单文件打包是在多文件打包的基础上进行的。也就是说,PyInstaller 先以多文件打包模式打包程序,再将【打包文件名】文件夹中的依赖文件编译到【打包文件名.exe】可执行文件中。
打包结束后,双击【dist】文件夹中的【打包文件名.exe】,我们会发现在【Temp】临时文件夹中出现了一个名称以【_MEI】开头的文件夹,里面包含所有的依赖文件。【_MEI】文件夹会在程序关闭时自动被删除掉。但是如果程序运行崩溃或者被强制退出(比如使用任务管理器强制退出)的话,那么这个文件夹是不会自动被删除的!这就会导致磁盘内存被占用,需要我们手动进行删除。
采用单文件打包模式生成的【打包文件名.exe】在运行时,会先花费一点儿时间把依赖文件解压出来,再显示运行结果。这就是为什么通过单文件打包模式打包出来的程序在运行时会比较慢。
我们可以使用通配符 *
来添加多个资源文件。比如 --add-data=*;./assets/
就表示将当前路径下的所有文件放在【打包文件名】文件夹下名为【assets】的文件夹中。我们也可以添加同种格式的多个文件,比如 --add-data=*.jpg;./images/
就表示将当前路径下的所有 .jpg 格式的文件放到【打包文件名】文件夹下名为【images】的文件夹中。
四、减少打包后文件的大小
PyInstaller 会把 Python 环境和程序使用到的库打包进来,有时候还会打包一些明明没有用到的第三方库,导致打包所花的时间越来越多,包也越来越大。这是,我们可以使用虚拟环境,在这个虚拟环境中我们可以只安装需要的第三方模块。
如果目前无法在干净的环境中打包,那么可以使用 --exclude-module
命令,它的作用是在打包时排除指定的库或模块,这样就不会把无关的文件包含进来了,使用格式如下:
pyinstaller --exclude-module=模块名 启动文件.py -n 打包文件名
五、其它常用的命令
当打包完毕后,我们可能会想修改一下源码然后重新打包。那么第二次打包时 PyInstaller 会询问是否要删除之前打包生成的文件,此时需要我们往命令提示符窗口中输入 y 或者 N。如果在打包命令中加上 -y
,那 PyInstaller 会直接删除上次打包遗留下的文件,不会询问。
pyinstaller -D -w --icon="图标文件.ico" -y 启动文件.py -n 打包文件名
--clean
命令用来删除前一次打包留下的缓存文件,不过在删除前 PyInstaller 会先询问是否确认执行,所以我们可以加上 -y
命令。
pyinstaller --clear -y 启动文件.py