打包前置知识
一、什么是exe可执行文件?
exe 文件英文全名是 executable file,翻译为可执行文件(但它不等于可执行文件),可执行文件包含两种,文件扩展名为 .exe 的是其中的一种。正确的 exe 文件可以在 Windows 平台上直接双击运行!我们通常用的各种软件都是通过快捷方式打开的,而这个快捷方式的目标地址就是这个软件的一个 exe 文件。
二、为什么要将 Python 程序打包为 exe 可执行文件?
众所周知,Python 程序的运行必须要有 Python 的环境,但是程序编出来是用的,如果是给别人用,而他/她的电脑上又没有 Python 程序运行的环境怎么办呢?总不能让他/她去安装一个吧?这时我们就要将 Python 程序打包为 exe 文件。这样,在 Windows 平台下,就可以直接运行该程序,不论有没有 Python 环境。
三、为什么 Python 程序不能直接运行呢?
Python 是解释性语言,它与 C 或者 C++ 等编译型语言不同,C 或者 C++ 都是要编译再运行的,(编译产生的最终文件就是 exe 文件),Python 本质上只是对一段文本进行解释,类似于浏览器解析 html 文档,是不会产生任何 exe 文件的。
四、我们用什么来打包 Python 文件呢?
一般我们都用 Python 的 Pyinstaller 模块进行打包,也有其他的打包模块,不过相比之下,Pyinstaller 的使用者最多,用起来也很简单,因此本文章就以 Pyinstaller 模块来打包 Python 程序。
五、打包有哪几种分类呢?
根据需要,下面的方法大家可以任选一种进行打包(我一般用第 3 个),不过新手的话建议全部都看一下哦。
① 一般的打包
步骤最少,操作最简单,但是打包时间久,效果不理想(打包后文件太大,一般 100MB 以上)
② 虚拟环境下的打包
步骤稍多,操作略微复杂,但是打包快,效果好(打包后文件不大,一般 10MB 以内)
③ 多 Python 文件的打包
步骤更多,操作更复杂,但是可以将多个 Python 文件都打包进去
④ 包含资源文件的打包
步骤极为繁琐,操作非常复杂,但是可以把所有的文件都包含进去
打包的方法
一般的打包
一般的打包方式,最简单,但是打包的成品有些许臃肿,不是特别推荐。
1、打开 Anaconda Prompt
如果你安装了 Anaconda 的 Python 集成环境的话,在菜单页面的所有应用里面可以看到 Anaconda 以及 Anaconda Prompt。
Anaconda
点进去就可以看见如下的界面:
Anaconda Prompt
2、下载并安装 Pyinstaller 模块
这个用 pip 模块直接下载就行,直接就下载在本次需要打包的 Python 环境下(base 环境)
pip install Pyinstaller
pip insatll Pyinstaller
当然了,已经安装过 Pyinstaller 模块的可以跳过这一步。
如果出现什么疑难杂症,大概率是权限导致的问题,按照下面的方法重新打开 Anaconda Prompt 就好了。
管理员身份打开
此时,Anaconda Prompt 的显示文字会变成如下这样:
然后再 pip 就行,这样应该就没有什么问题了。
3、切换命令行的路径管理员身份运行
因为你要打包的文件在对应的文件夹里面,而 Pyinsatller 一开始是不知道要打包的文件在哪里的,所以要直接切换命令行的路径到目标文件夹路径,使得后面的步骤中,Pyinstaller 可以找到对应的文件。
cd 文件夹路径
这里我的打包文件夹放在了桌面上,文件夹名为 test,要打包的 Python 文件在 test 文件夹内,名为 Python.py 。于是我的文件夹路径为 C:\Users\小康\Desktop\test(一定要是绝对路径)。
切换路径然后回车就可以看到下面这样的就说明成功了。
切换路径
4、打包 Python 文件
输入如下格式的命令即可
Pyinstaller -option1 -option2 -... 要打包的文件
参数选项比较多,这里我列一个表:这里简单地举几个例子,让大家明白这个参数怎么写。
# 这一般是用来打包界面化的程序的,如用tkinter、Pyqt5等制作的程序。 # -w 的意思就是exe运行的时候不弹出那个命令行(黑窗口) Pyinstaller -F -w somefile.py # 这一般用来添加exe的图标 Pyinstaller -F -i someicon.ico somefile.py
打包文件
然后回车它就会自动打包了。说明一下,一般我们都只会选择其中的几个参数选项,如 -F 和 -w,根据需要,我们还会选择其他的一些参数。当出现如下的文字(主要是最后一行文字)时就代表打包成功了!