前言:
所谓Python程序打包,就是将编写好的.py文件制作成.exe可执行程序,使其可以便于携带与分发,在没有安装Python环境的电脑中也能随时双击就能运行。
工具介绍
本文将介绍两种常用的Python打包工具——Pyinstaller以及Nuitka 的基础和进阶使用方法。
对比
先上两种工具的对比:
打包工具 | 难易程度 | 占用储存空间 | 程序运行效率 | 代码安全性 | 兼容性 |
---|---|---|---|---|---|
Pyinstaller | 极易✅ | 较大 | 较低 | 不安全 | 较高✅ |
Nuitka | 较难 | 较小✅ | 较高✅ | 较安全✅ | 看情况,也没啥大问题 |
Pyinstaller
Pyinstaller极易上手,但是打包完占用空间很大,运行效率低(打开要等几秒),源码很容易被解包获取。使用此工具相当于把源码和Python的运行环境都塞一个压缩包里,但也正因此兼容性较高,几乎在所有设备上都能正常运行。
Nuitka
Nuitka打包原理是把py及其支持库全部用c编译,所以占用空间小,运行效率高,编译过的程序也较为安全,但可能在某些电脑上因为设备本身缺少某些vc运行库而导致无法运行,需要额外安装。另外Nuitka对Pyqt系列的支持还不完整,可能遇到预期外的错误。
Nuitka基础功能也较为简单,但其玩法很多,比如可以更换编译器,upx压缩等。
但综合来看,Nuitka还是更适合正式分发(因为相对空间小、效率高、代码更安全)。著名3D建模工具Blender也是使用Nuitka打包的,因此本文将更侧重于介绍Nuitka使用方法,您也可以选择直接阅读Nuitka部分。
食用方法
Pyinstaller
安装工具
pip install pyinstaller
如果安装速度较慢,请尝试更换pip清华源后在运行上面的命令
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后,在.py文件的目录下运行命令行提示符(cmd或Shell)
基础命令
在终端中输入命令:
pyinstaller -F test.py
这是最基础的打包命令,会在你的工作文件夹下生成一个build和dist文件夹还有一个spec文件,你需要的.exe就在dist里边,双击即可运行。
进阶命令
Pyinstaller后接的参数 | 功能 |
---|---|
-F | 生成一个可执行文件(单个文件)。 |
-D | 生成一个目录(包含多个文件)作为可执行文件。 |
-w | 运行exe时,不显示命令行窗口(仅对Windows有效)。 |
-i | 该参数后跟可执行文件的icon图标路径,如-i xxx.ico。 |
–distpath | 该参数后跟可执行文件的路径。 |
-n | 该参数后跟可执行文件的新名字。 |
之前在打包点名器时常用的命令:
Pyinstaller -D -w -i picker.ico main.py (打包成多文件、关闭调试界面、设置图标)
有关Pyinstaller更详细的操作说明,可以参考:
Python生成exe和安装包之Pyinstaller带参数【只看这篇就够了】_pyinstaller -p参数-CSDN博客
Nuitka
安装工具
pip install nuitka
需求
- C 编译器。你需要一个支持 C11 或 C++03 的编译器 。这意味着,你需要使用下面这些编译器:
- Windows 上的 MinGW64 C11 编译器,必须基于 gcc 11.2 或更高。如果没有找到可用的 C 编译器,它将被自动下载,这是推荐的安装方式。(或手动配置方法,请在下载链接中8.1上方的文件夹mingw-w64/ mingw-w64-release/里下载最新的gcc12版本)
- Windows 上的 Visual Studio 2022 或更高版本(使用Clang编译方式时)
- 在所有其他平台上,至少使用 5.1 版的
gcc
编译器,低于此版本的g++
编译器至少使用 4.4 版作为替代。 - macOS X 和大多数 FreeBSD 架构上的
clang
编译器。
- Python: Version 2.6, 2.7 or 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11(不要3.12及以上版本)
基础命令
nuitka --standalone --mingw64 --windows-disable-console --output-dir=o --windows-icon-from-ico=wc.ico demo.py
当你的程序很简单,没有使用Pyqt5或其他复杂的库时,可以尝试使用以上命令直接打包。
命令 | 功能 |
---|---|
--standalone | 启用独立模式进行输出。这允许你将二进制文件传输到其他机器, 而无需使用已有的Python环境。这也意味着它将变得很大。它将启用这些选项: "--follow-imports" 和 "--python-flag=no_site"。 默认关闭。 |
--mingw64 | 强制在 Windows 上使用 MinGW64。默认为关闭,除非使用 MSYS2 和 MinGW Python。 |
--windows-disable-console | 在为Windows或macOS编译时,禁用控制台窗口并创建为一个GUI应用程序。默认关闭。 |
--output-dir=o | 输出的文件夹名为o。 |
--enable-plugin=Pyqt5 | 启用Pyqt5支持插件,详细插件列表看下面。 |
--windows-icon-from-ico | 设置打包完程序的图标,后接 xxx.ico。 |
demo.py | 在指令最后接上要打包的py文件名。 |
插件
进阶命令
我目前在做的一个小工具使用的打包命令:
nuitka --standalone --lto=no --clang --msvc=latest --disable-ccache --windows-uac-admin --windows-disable-console --enable-plugin=pyqt5,upx --upx-binary=E:\ctest\o\upx\upx.exe --output-dir=o --windows-icon-from-ico=wc.ico demo.py
命令 | 功能 |
---|---|
--lto=no | 使用链接时间优化(MSVC、gcc、clang)允许的值有 "yes"(是)、"no"(否)和 "auto"(自动)(已知可用)。默认为 "auto"。 进测试lto=no(否)效率最高。 |
--clang | 强制使用 clang 编译。在 Windows 系统上,这需要一个正常运行的 Visual Studio 版本来支持。默认关闭。clang比mingw64效率更高,但环境部署很麻烦。 |
--msvc=latest | 强制在Windows上使用特定的MSVC版本。允许的值有"14.3" (MSVC 2022)和其他MSVC版本号。 使用 "list "以获得已安装编译器的列表,或使用 "latest"。默认在有的情况下使用最新的MSVC。否则使用MinGW64。 |
--disable-ccache | 禁用ccache,禁用提升效率。 |
--windows-uac-admin | 使程序以管理员身份运行。 |
--windows-disable-console | 在为Windows或macOS编译时,禁用控制台窗口并创建为一个GUI应用程序。默认关闭。 |
--enable-plugin=pyqt5,upx --upx-binary=xxx | 启用pyqt5和upx插件,upx后接upx.exe的实际位置。 |
更详细的参数请访问Options(选项) - nuitka 文档 (0.org.cn)、用户手册Nuitka 用户手册 (daobook.github.io)
Clang编译器、禁用lto、禁用ccache,使得程序效率最高,Clang打包的大小也比Mingw64小。
部署Clang环境:clang 在 Windows 下的安装教学 - 知乎 (zhihu.com)
UPX压缩
单独说UPX压缩,是因为UPX压缩确实NB,最近做的Py课设,网页词云生成器,打包完有220mb,开个UPX就只有50mb了,直接干成了四分之一,而且对运行效率几乎没有影响。
下载UPX:https://github.com/upx/upx/releases下载对应平台的压缩包,然后解压将命令中的UPX目录替换一下就能使用了。
但是UPX压缩完使用了Pyqt5的文件后,需要手动将Python\Lib\site-packages\PyQt5\Qt5\plugins里用到的东西复制到打包完的文件目录里的\PyQt5\qt-plugins里面,因为似乎UPX压缩完这些会出问题
踩过的坑
虚拟环境
最好在虚拟环境中使用。如果不用虚拟环境:
Pyinstaller打包文件巨大,整个py和库都会塞进去,不管用没用到。
nuitka打包文件也大,而且可能会出现玄学问题,打包完无法启动,比如像我这主环境同时存在Pyqt5和Pyqt6,打包完就会有问题,必须要虚拟环境
兼容性
使用Nuitka务必选择Python2.6, 2.7 or 3.3, 3.4, 3.5, 3.6, 3.7, 3.8(WIn7可用), 3.9, 3.10, 3.11(推荐)
不要3.12及以上版本!因为3.12是一个过渡版本,3.13会大幅优化JIT,但还不完善且还是测试版
制作安装包
制作安装包将在下一篇文章中介绍!使用Inno Setup
Comments 6 条评论
博主 半自由
太笨了,咱学不会
博主 yish
@半自由 遇到什么困难了?我也来学习一下
博主 倦意
失踪人口诈尸
博主 yish
@倦意
Deprecated: openssl_encrypt(): Passing null to parameter #3 ($passphrase) of type string is deprecated in /home/wwwroot/xyorg/wwwroot/wp-content/themes/sakurairo-private-branch/functions.php on line 2021
Deprecated: openssl_encrypt(): Passing null to parameter #3 ($passphrase) of type string is deprecated in /home/wwwroot/xyorg/wwwroot/wp-content/themes/sakurairo-private-branch/functions.php on line 2021
博主 {QQB}
( ♥д♥)
博主 yish
@{QQB}