将Python程序打包为exe(可执行程序)
前言:
- 大家都知道,Python 是一种脚本语言,也就是解释型的语言,需要解释器来进行解释以后才可以执行,而 Python 源代码需要在 Python 虚拟机上面运行,但是我们做好的程序,不可能给用户使用的时候还让他安装一个 Python 环境,所以今天我们讲解如何将 Python 程序打包为 exe 可执行文件。
- PyInstaller 是一个非常流行的第三方工具,它可以将 Python 程序打包成独立的可执行文件,使得程序能够在没有安装Python 解释器的环境中运行。这对于分发 Python 应用程序来说非常有用,因为用户不需要关心如何安装 Python 环境和依赖包。
项目地址
安装 PyInstaller
PyInstaller 可在 PyPI 上使用。您可以通过 pip 安装它:
1 | pip install -U pyinstaller |
验证安装
pyinstaller
现在,在所有平台上,命令都应该存在于执行路径上。要验证这一点,请输入命令
1 | pyinstaller --version |
结果类似于:6.3.0
环境要求
- PyInstaller 可以在 Windows 8 或更高版本中运行(Windows 7 也可以使用,但不受支持)。它可以创建图形化窗口应用程序(不需要命令窗口的应用程序)。
- PyInstaller 在 Windows 系统中需要两个 Python 模块。它需要 Windows 的 PyWin32或 pypiwin32 Python 扩展。如果您使用 pip 安装 PyInstaller,并且尚未安装 PyWin32,则会自动安装 pypiwin32。 PyInstaller 还需要 pefile软件包。
- Python 版本:建议使用 Python3.x
PyInstaller 关键特性
- 跨平台兼容:PyInstaller 支持多个操作系统,包括 Windows、Linux 和 macOS。
- 无需源代码:打包的可执行文件中不包含源代码,这可以保护源代码不被轻易查看。
- 支持依赖包含:PyInstaller 会自动分析你的Python程序,找到所有的依赖关系,并将它们包含到打包的可执行文件中。
- 可选打包模式:支持 onefile 和 onedir 两种打包模式。在 onefile 模式下,所有的文件都会被打包进一个单一的可执行文件中;而在 onedir 模式下,会生成一个包含所有依赖文件的文件夹。
- 自定义打包:PyInstaller 允许用户通过编辑
.spec
文件来自定义打包过程,例如添加数据文件、更改路径、添加图标等等。 - UPX集成:PyInstaller 可以集成 UPX 压缩工具来减小最终可执行文件的大小。
参数介绍
简介
官网参数详细介绍,在使用 pyinstaller 打包 Python 项目的时候,需要指定一些参数,详细介绍请参考官网。也可以通过 pyinstaller -h
命令查看 pyinstaller 的参数使用介绍。
常规选项
--help
或-h
:显示帮助信息和所有可用的命令行选项。--version
:显示 PyInstaller 的版本号。--onefile
或-F
:生成单个可执行文件。默认情况下,PyInstaller 会创建一个包含可执行文件和一个包含所有依赖的文件夹。使用此参数后,所有内容会被打包进一个文件。--windowed
或-w
:对于图形用户界面(GUI)应用程序,使用此参数可以防止在运行程序时出现命令行窗口。--console
或-c
:创建一个控制台程序,这是默认选项。--icon=ICON_FILE
或-i ICON_FILE
:添加一个图标(ICON_FILE)到生成的可执行文件中。ICON_FILE 必须是 .ico 格式的文件(在 Windows 上),或者是 .icns(在 macOS 上)。--name=NAME
:指定输出的可执行文件名称。如果不使用此选项,PyInstaller 会使用脚本名作为可执行文件的名字。--add-data=<SRC;DEST>
或-a <SRC;DEST>
:将额外的数据文件或文件夹添加到打包的输出中。SRC 是源文件或文件夹的路径,DEST 是目的地路径。在 Windows 中使用分号,在 UNIX 类系统中使用冒号分隔 SRC 和 DEST。--upx-dir=UPX_DIR
:如果你已经安装了 UPX,可以使用此参数指定 UPX 可执行文件的路径,否则 PyInstaller 会在 PATH 环境变量中搜索。--clean
:清除 PyInstaller 缓存和临时文件,然后创建新的可执行文件。--noconfirm
:在创建可执行文件之前,不要求用户确认删除先前的输出目录。--hidden-import=MODULENAME
或--hiddenimport MODULENAME
:PyInstaller 分析脚本时可能会错过一些导入。如果发现缺少模块错误,可以使用此选项强制添加隐藏的导入。--runtime-tmpdir PATH
:指定在运行时 PyInstaller 解包临时文件的目录。--distpath DIR
:指定打包后的输出目录。默认情况下是脚本所在目录下的dist
目录。--workpath WORKPATH
:指定 PyInstaller 用来存放工作文件的临时目录。--specpath DIR
:指定 .spec 文件的输出目录。如果不指定,将使用脚本所在目录。--paths=DIR
:在分析时添加搜索路径,这可以用来指示 PyInstaller 在哪里查找导入的模块。--runtime-hook=FILE
:添加一个自定义 Python 脚本,在运行时作为钩子执行。--exclude-module=MODULENAME
:排除特定的 Python 模块。
常用参数
-D, –onedir | 创建包含可执行文件的单文件夹包 (默认) |
---|---|
-F, –onefile | 创建一个可执行文件(exe) |
-c, –console, –nowindowed | 使用控制台窗口 (默认) |
-w, –windowed, –noconsole | 使用窗口显示 |
-i | 设置打包 exe 的图标,默认使用的是 Python 的图标 |
单个 py 文件打包
- 运行以下代码进行打包
1
pyinstaller -F -i calc.ico calc.py
参数解释:
-i calc.ico
表示程序图标及图标地址;calc.py
表示你的 Python 程序文件名 - 打包结束会后,会在项目目录下发现多了 dist 和 build 两个目录文件和一个
*.spec
的文件。 - 打开 dist 目录,可以发现下面多了一个 dcalc.exe 的可执行文件,双击运行即可!
- ⚠️注意:如果原本的程序中使用到了相应的资源,需要复制到 dist 目录下,否则程序会无法运行!
- 如果不想显示控制台,打包的时候可以加上
-w
参数,例如:1
pyinstaller -F -w -i calc.ico calc.py
此时打包生成的 exe 程序执行时不会出现控制台窗口。
简介
- UPX是一款免费、安全、可移植、可扩展、高性能的**可执行加壳程序,**适用于多种可执行格式。
- UPX(Ultimate Packer for eXecutables)是一个开源的可执行文件压缩器,用于减小 Windows、Linux、macOS 等操作系统上可执行文件的体积。它支持多种文件格式,包括但不限于 Windows 的 EXE、DLL 和 Linux 的 ELF 文件。UPX 能够压缩文件而不丧失其自身解压缩的能力,这意味着压缩后的文件可以自解压并正常运行,无需外部解压工具。
- UPX是一种先进的可执行文件压缩器。UPX 通常会将程序和 DLL 的文件大小减少约 50%-70%,从而减少磁盘空间、网络加载时间、下载时间以及其他分发和存储成本。
UPX 的特点
- 高压缩比:使用UPX压缩的文件通常可以显著减小体积,这对于带宽有限或存储空间有限的环境非常有用。
- 快速解压:尽管文件被压缩,但在运行时能够迅速解压,对程序启动时间影响很小。
- 跨平台:支持多个操作系统平台的可执行文件压缩。
- 易用性:命令行界面简单,易于使用。
- 透明压缩:用户不会注意到程序已被压缩,因为压缩的程序在运行时自动解压。
- 可逆性:UPX也支持解压缩先前压缩的文件,还原到它们的原始状态。
下载并安装
- 通过 GitHub Releases 页面下载需要版本的 UPX
- 这里以 Windows 版(upx-4.2.2-win64.zip)为例
使用 UPX
- 在使用 PyInstaller 时添加
--upx-dir
参数指向 UPX 的安装路径,如:1
pyinstaller --onefile --windowed --upx-dir='D:\Program Files\upx-4.2.2-win64' -i upload.ico upload_csv.py
- PyInstaller 的
--upx-dir
选项应该指向 UPX 的安装目录,而不是 UPX 可执行文件本身。因此,你只需要指定到upx.exe
所在的目录,而不是包括upx.exe
文件的完整路径。 - 确保 UPX 可执行文件的路径没有错误,并且已经被添加到系统的环境变量中,或者在调用 PyInstaller 时明确指定
--upx-dir
路径。 - 如果你已经将 UPX 的路径添加到系统的环境变量中,你可以省略
--upx-dir
参数,因为 PyInstaller 会自动搜索系统的环境变量来找到 UPX。