目录
一、打包前置知识
1.1 什么是 exe 可执行文件?
1.2 为什么要将 Python 程序打包为 exe 可执行文件?
1.3 为什么 Python 程序不能直接运行呢?
1.4 我们用什么来打包 Python 文件呢?
1.5 打包有哪几种分类呢?
二、打包的方法
2.1 简单打包
2.1.1 前置
2.1.2 直接打包
2.1.3 稍微“加密”一下源代码
2.2 一般的打包
2.2.1 打开 Anaconda Prompt
2.2.2 下载并安装 Pyinstaller 模块
2.2.3 切换命令行的路径
2.2.4 打包 Python 文件
2.2.5 打包生成文件的位置
2.3 虚拟环境下的打包
2.3.0 先介绍几个 conda 命令
2.3.1 创建虚拟环境
2.3.2 安装需要的第三方包
2.3.3 追求极致的exe大小(非必要步骤)
2.4 多 Python 文件的打包
2.4.1 生成spec文件
2.4.2 编辑spec文件
2.4.3 以spec文件进行打包
2.5 包含资源文件的打包
2.5.0 一点吐槽
2.5.1 编辑spec文件
2.5.2 修改文件打开函数
三、打包实战
3.1 打包方式的选择
3.2 打包全过程
3.2.1 第一步:启动 Anaconda Prompt,切换至目标文件夹路径位置
3.2.2 第二步:启动虚拟环境(我的是一个纯净的、第三方包只有 Pyinstaller 的环境)
3.2.3 第三步:生成 spec 文件(我的 Pyinstaller 已经安装好了)
3.2.4 第四步:引入 _.py 模块(我的程序用到了大量 open 函数且涉及多文件)
3.2.5 第五步:编辑 spec 文件
3.2.6 第六步:打包项目(注意这里的对象是 spec 文件)
3.2.7 第七步:检验打包效果
四、疑难解答与相关建议
4.1 疑难解答
4.1.1 模块找不到的错误 —— ModuleNotFoundError
4.1.2 图形化程序运行没反应,但也没有报错
4.1.3 语法错误 —— SyntaxError
4.1.4 'pyinstaller' 不是内部或外部命令……
4.1.5 其他情况
4.2 相关建议
4.2.1 关于虚拟环境的建立
4.2.2 关于项目文件的操作
注意:文章已在 2023/11/07 再次修改,用语更严谨,格式更规范,且新增一种打包的方式! 👍
一、打包前置知识
1.1 什么是 exe 可执行文件?
exe 文件英文全名是 executable file,翻译为可执行文件(但它不等于可执行文件),可执行文件一般来说包含两种,文件扩展名为 .exe 的是其中的一种。正确的 exe 文件一般可以在 Windows 平台上直接双击运行!我们通常用的各种软件都是通过快捷方式打开的,而这个快捷方式的目标地址就是这个软件的一个 exe 文件。还有其他的可执行文件,这里就不详述了。
1.2 为什么要将 Python 程序打包为 exe 可执行文件?
众所周知,Python 程序的运行必须要有 Python 的环境,但是程序编出来是用的,如果是给别人用,而他/她的电脑上又没有 Python 程序运行的环境怎么办呢?总不能让他/她去安装一个吧?这时我们就要将 Python 程序打包为 exe 文件。这样,在 Windows 平台下,就可以直接运行该程序,不论有没有 Python 环境。不过呢,如果对方使用的是 Linux 系统,自带了符合版本要求的 Python 环境,那就不必打包,也更用不到 pyinstaller 了。
1.3 为什么 Python 程序不能直接运行呢?
Python 是解释性语言,它与 C 或者 C++ 等编译型语言不同,C 或者 C++ 都是要编译再运行的,(Windows 平台下编译产生的最终文件一般就是 exe 文件),Python 本质上只是对一段文本进行解释,类似于浏览器解析 html 文件,是不会产生任何可执行文件的。
1.4 我们用什么来打包 Python 文件呢?
一般我们都用 Python 的 Pyinstaller 模块进行打包,也有其他的打包模块,不过相比之下,Pyinstaller 的使用者最多,用起来也很简单(但效果并不一定是最好的,这里推荐一个效果可能更好的模块 —— Nuitka),因此本文章就以 Pyinstaller 模块来打包 Python 程序。
1.5 打包有哪几种分类呢?
根据需要,下面的方法大家可以任选一种进行打包(我一般用第 1 个),不过新手的话建议全部都看一下哦。
① 简单打包:操作最简单,成功可能性最高,不兼容的可能性最低,但无法保护源代码,只能保证可以无需 Python 环境即可运行② 一般打包:步骤最少,操作最简单,但是打包时间久,效果不理想(打包后文件太大,一般 100MB 以上)③ 虚拟环境下的打包:步骤稍多,操作略微复杂,但是打包快,效果好(打包后文件不大,一般 10MB 以内)④ 多 Python 文件的打包:步骤更多,操作更复杂,但是可以将多个 Python 文件都打包进去⑤ 包含资源文件的打包:步骤极为繁琐,操作非常复杂,但是可以把所有的文件都包含进去
二、打包的方法
2.1 简单打包
此方法非常适合于开源用户,如果你没有保护源代码的需求(无所谓源代码会不会被看到),那我强烈强烈强烈推荐你使用此方法,这也是我目前一直使用的方法!因为它实在是太简单了,而且几乎不会出现什么问题!
但是一定一定要注意,这种打包方式,源代码虽然无法被保护,但也不是说直接可以给别人看到的,我们可以对它稍微“加密”一下,后面会讲,非常简单的。
另外,此方法为 2023/11/07 添加到这篇文章中的,因此我不会对其像后面几个方法那样进行详述,如有在操作步骤上的问题,可参考后面方法的步骤。
2.1.1 前置
此方法推荐要在学会搭建虚拟环境的情况下操作,效果比较好。关于搭建虚拟环境,往文章下面看。
2.1.2 直接打包
搭建好虚拟环境后,安装所需的包,然后找到启动文件(你程序启动的那个 Python 文件),对其使用打包命令,打包完之后,直接将产生的 dist 文件中的 exe 移动工程目录的根目录下,用它代替启动文件即可,双击起飞!
但是要注意,把文件发给别人使用的时候,必须将整个项目文件夹发给别人,而不是一个 exe 文件。
2.1.3 稍微“加密”一下源代码
打包前运行一下项目,确保执行每个功能后关闭程序,将产生的每个 __pycache__ 文件夹中的文件移动到项目中去,代替对应名称的源代码(记得去除文件名中多余的部分)。然后,源代码文件就可以删除了(记得这样做之前备份整个项目的源代码)。
__pycache__ 中都是 pyc 文件,有兴趣的朋友可以了解一下。这不是真正的加密(可以很容易地被解密),pyc 文件都是 Python 解释器产生的字节码文件,但是这样别人也无法直接看到源代码了。
2.2 一般的打包
一般的打包方式,最简单,但是打包的成品有些许臃肿,不是特别推荐。
2.2.1 打开 Anaconda Prompt
如果你安装了 Anaconda 的 Python 集成环境的话,在菜单页面的所有应用里面可以看到 Anaconda 以及 Anaconda Prompt。
re>
Anaconda re>
点进去就可以看见如下的界面:
Anaconda Prompt re> 2.2.2 下载并安装 Pyinstaller 模块
这个用 pip 模块直接下载就行,直接就下载在本次需要打包的 Python 环境下(base 环境)
pip install Pyinstaller
pip insatll Pyinstaller re> 当然了,已经安装过 Pyinstaller 模块的可以跳过这一步。
如果出现什么疑难杂症,大概率是权限导致的问题,按照下面的方法重新打开 Anaconda Prompt 就好了。
管理员身份打开 re> 此时,Anaconda Prompt 的显示文字会变成如下这样:
管理员身份运行 re> 然后再 pip 就行,这样应该就没有什么问题了。
2.2.3 切换命令行的路径
因为你要打包的文件在对应的文件夹里面,而 Pyinsatller 一开始是不知道要打包的文件在哪里的,所以要直接切换命令行的路径到目标文件夹路径,使得后面的步骤中,Pyinstaller 可以找到对应的文件。
cd 文件夹路径
这里我的打包文件夹放在了桌面上,文件夹名为 test,要打包的 Python 文件在 test 文件夹内,名为 Python.py 。于是我的文件夹路径为 C:\Users\小康\Desktop\test(一定要是绝对路径)。
re>
切换路径 re> 然后回车就可以看到下面这样的就说明成功了。
切换路径 re> 2.2.4 打包 Python 文件
输入如下格式的命令即可
Pyinstaller -option1 -option2 -... 要打包的文件
参数选项比较多,这里我列一个表:
参数选项 | 描述 |
-F, -onefile | 只生成一个单个文件(只有一个 exe 文件) |
-D, -onedir | 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,这样代码易于维护 |
-K, –tk | 在部署时包含 TCL/TK |
-a, -ascii | 不包含编码 在支持 Unicode 的 Python 版本上默认包含所有的编码 |
-d, -debug | 产生 debug 版本的可执行文件 |
-w, -windowed, -noconsole | 使用 Windows 子系统执行 当程序启动的时候不会打开命令行(只对 Windows 有效) |
-c, -nowindowed, -console | 使用控制台子系统执行(默认)(只对 Windows 有效) pyinstaller -c xxxx.py pyinstaller xxxx.py --console |
-s, -strip | 可执行文件和共享库将 run through strip 注意 Cygwin 的 strip 往往使普通的 win32 Dll 无法使用 |
-X, -upx | 如果有 UPX 安装(执行 Configure.py 时检测),会压缩执行文件( Windows 系统中的 DLL 也会) |
-o DIR, -out=DIR | 指定 spec 文件的生成目录,如果没有指定,而且当前目录是 PyInstaller 的根目录,会自动创建一个用于输出( spec 和生成的可执行文件)的目录 如果没有指定,而当前目录不是 Pyinstaller 的根目录,则会输出到当前的目录下 |
-p DIR, -path=DIR | 设置导入路径(和使用 PYTHONPATH 效果相似) 可以用路径分割符( Windows 使用分号,Linux 使用冒号)分割,指定多个目录 也可以使用多个 -p 参数来设置多个导入路径,让 pyinstaller 自己去找程序需要的资源 |
-i -icon=<FILE.ICO> | 将 file.ico 添加为可执行文件的资源(只对 Windows 系统有效),改变程序的图标 |
-i -icon=<FILE.EXE,N> | 将 file.exe 的第 n 个图标添加为可执行文件的资源(只对 Windows 系统有效) |
-v FILE, -version=FILE | 将 verfile 作为可执行文件的版本资源(只对 Windows 系统有效) |
-n NAME, -name=NAME | 可选的项目(产生的 spec 的)名字 如果省略,第一个脚本的主文件名将作为 spec 的名字 |
这里简单地举几个例子,让大家明白这个参数怎么写。
# 这一般是用来打包界面化的程序的,如用tkinter、Pyqt5等制作的程序。# -w 的意思就是exe运行的时候不弹出那个命令行(黑窗口)Pyinstaller -F -w somefile.py# 这一般用来添加exe的图标Pyinstaller -F -i someicon.ico somefile.py