Python程序打包-从入门到放弃

yish 发布于 2024-06-08 553 次阅读 预计阅读时间: 15 分钟


前言:

所谓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

这是最基础的打包命令,会在你的工作文件夹下生成一个builddist文件夹还有一个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目录替换一下就能使用了。

虚拟环境

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(推荐)

制作安装包

制作安装包将在下一篇文章中介绍!使用Inno Setup