一、打包的几种方法
Python 有多种打包方式可用于将脚本打包成可执行文件,以便在没有 Python 解释器的环境中运行。以下是一些常见的 Python 打包方式:
-
使用
pyinstaller
:pyinstaller
是一个常用的第三方工具,可以将 Python 脚本打包成可执行文件。它可以自动检测脚本的依赖项,并将它们一起打包成一个独立的可执行文件。 -
使用
py2exe
:py2exe
是另一个常用的第三方工具,用于将 Python 脚本打包成可执行文件。它提供了简单的配置选项,可以将所有的依赖项打包到一个文件夹中,并生成一个可执行文件。 -
使用
cx_Freeze
:cx_Freeze
是一个用于将 Python 脚本打包成可执行文件的第三方库。它可以将脚本及其依赖项打包成一个目录结构,并生成一个可执行文件。 -
使用
Nuitka
:Nuitka
是一个用于将 Python 脚本编译成 C/C++代码的工具。它可以将脚本编译为独立的可执行文件,而不需要 Python 解释器。 -
使用
py2app
:py2app
是用于在 Mac 上将 Python 脚本打包成可执行文件的工具。它可以将脚本及其依赖项打包成一个应用程序包。
这些工具都有各自的特点和用法,你可以根据自己的需求选择其中之一来打包你的 Python 脚本。请注意,打包过程可能会涉及到一些配置和依赖项的处理,具体使用方法请参考各个工具的官方文档。
Pyinstaller 打包
(1)先安装 pyinstaller
pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com pyinstaller
(2)再执行打包
# -w 可以隐藏控制台输出
pyinstaller --clean -w -F 文件名.py
打包后的 windows 可执行程序将会出现在当前运行程序的 dist 文件夹下。
(3)缩小体积
首先安装 pipenv
pip install pipenv
安装完成后即可创建虚拟环境并进入打包
#建立虚拟环境
pipenv install
#进入虚拟环境
pipenv shell
#安装模块
pip install 小工具.py里面用到的模块
#打包的模块也要安装
pip install pyinstaller
#开始打包
pyinstaller -Fw main.py
#退出环境
exit
#删除虚拟环境
pipenv --rm
发现没有用 UPX 压缩,下载 UPX 再利用 UPX 压缩,在 https://upx.github.io/里面下载自己想要的版本 。
下载下来的是一个压缩包,我们只需要解压后把里面的 upx. Exe 文件复制到 pyinstaller. Exe 同个文件夹(一般是Scripts文件夹)内即可。Pyinstaller 默认会从执行目录里搜索 upx 执行文件,如果找到 upx,会对生成的可执行文件进行压缩。
重新执行 pyinstaller 打包命令,如果像下图这样就说明使用 upx 配置成功
Nuitka 打包
Nuitka 是一个 Python 到 C++编译器,它通过将 Python 代码转换为 C++代码并编译成二进制可执行文件来实现性能优化,Nuitka 能够提供比原生 Python 解释器更高的性能和更好的体积。它的工作原理可以简要概括如下:
-
解析和转换:Nuitka 首先解析 Python 源代码,并将其转换为中间表示形式。在这个过程中,它会将 Python 的动态特性转化为静态的 C++代码。
-
代码优化:在转换过程中,Nuitka 会应用各种优化技术来提高生成的 C++代码的性能。这些优化包括常量折叠、代码内联、循环展开等。
-
生成 C++代码:一旦优化完成,Nuitka 将生成 C++代码,并将其保存到磁盘上的一个临时目录中。
-
编译成可执行文件:生成的 C++代码会被传递给 C++编译器,如 GCC 或 Clang,以生成最终的二进制可执行文件。在这个过程中,C++编译器会将 C++代码编译成机器码,并与必要的库连接。
Nuitka 主程序安装
使用 pip
安装 Nuitka
:Nuitka
是一种优化的 Python 编译器,可以使用以下命令安装它:
pip install nuitka
使用 Nuitka
打包
打包过程会提示安装依赖环境,跟着提示安装即可。
# --windows-mode关闭控制台窗口;--enable-plugin=tk-inter启用tk,否则无法显示图形界面
nuitka --windows-disable-console --enable-plugin=tk-inter --output-dir=package --standalone your_script.py
Nuitka常用命令:
--windows-disable-console #不显示控制台窗口
--windows-icon=ICON_PATH #添加ico
--nofollow-imports # 所有的import不编译,交给python3x.dll执行
--follow-import-to=need #need为你需要编译成C/C++的py文件夹命名
--mingw64 #mingw(官方建议编译器)
--standalone #独立环境,这是必须的(否则拷给别人无法使用)
--windows-disable-console #没有CMD控制窗口
--output-dir=out #生成文件路径
--show-progress #显示编译的进度,很直观
--show-memory #显示内存的占用
--include-qt-plugins=sensible,styles #打包后PyQt的样式就不会变了
--plugin-enable=qt-plugins #需要加载的PyQt插件
--plugin-enable=tk-inter #打包tkinter模块的刚需
--plugin-enable=numpy #打包numpy,pandas,matplotlib模块的刚需
--plugin-enable=torch #打包pytorch的刚需
--plugin-enable=tensorflow #打包tensorflow的刚需
--windows-uac-admin=Windows #用户可以使用管理员权限来安装
--onefile #打包成单个exe文件
Nuitka 依赖环境Winlibs_mingw的安装
打包过程需要 winlibs_mingw,它提供了 gcc 等编译打包的各种环境,如果在线下载失败,可以直接去 github 代理下载,再放到用户目录下‘C:\Users\xxx\AppData\Local\Nuitka\Nuitka‘,这边打包时依赖的是’ https://github.com/brechtsanders/winlibs_mingw/releases/download/11.3.0-14.0.3-10.0.0-msvcrt-r3/winlibs-x86_64-posix-seh-gcc-11.3.0-llvm-14.0.3-mingw-w64msvcrt-10.0.0-r3.zip '。
还有依赖 ccache,这边打包依赖的版本是’ https://github.com/ccache/ccache/releases/download/v4.6/ccache-4.6-windows-32.zip ,ccache 是一个用于缓存编译器输出的工具,可以提高编译的速度。在编译大型项目时,往往需要花费很多时间来重新编译已经编译过的文件。Ccache 通过缓存编译器输出,可以在下次编译相同文件时直接使用缓存,避免了重新编译的过程,从而节省了编译时间。
Nuitka 依赖环境Ccache
Ccache 可以作为一个编译器前端,将编译命令转发给实际的编译器。在编译时,ccache 会检查输入文件是否已经被编译过,并且缓存了编译器的输出。如果文件已经被编译过且没有发生变化,ccache 会直接使用缓存的输出,而不会调用实际的编译器。只有当文件发生了变化或者缓存已经过期时,ccache 才会调用实际的编译器重新编译文件。
使用 ccache 可以显著加快编译的速度,特别是在多次编译相同文件的情况下。它对于开发大型项目或者频繁修改代码的开发者来说特别有用。
Nuitka 依赖环境Depends
如果还需要不依赖 python 环境单独运行,还要下载’ https://dependencywalker.com/depends22_x64.zip '。
打包完成后的文件删减
.cmd 和. Build 打包后都是可以删除的。
.cmd
文件,用于在 Windows 系统上运行打包的可执行文件的一个小脚本。这个脚本负责设置必要的环境变量,并启动打包的可执行文件。
当您使用 Nuitka 打包 Python 代码时,除了生成独立的可执行文件之外,它还会为可执行文件生成一个 .cmd
文件,以便在 Windows 系统上更方便地运行该文件。
您可以通过双击或在命令提示符中运行 .cmd
文件来执行打包的可执行文件,而无需手动设置环境变量或编写额外的脚本。.cmd
文件在运行时将确保正确地设置环境,然后启动打包的可执行文件。
可能遇到的问题
Orderedset 警告
Nuitka:WARNING: Using very slow fallback for ordered sets, please install 'orderedset' PyPI package
Nuitka:WARNING: for best Python compile time performance.
该警告信息是 Nuitka 的一个提示,它建议您安装 orderedset
PyPI 包以获得最佳的 Python 编译时间性能,如果没有装 Microsoft Visual Studio,那建议警告还是不要解决了,需要安装相关环境,文件很大。
orderedset
是一个用于有序集合的Python库。在某些情况下,Nuitka可能会使用一个较慢的替代方法来处理有序集合,而不是使用orderedset
库。这可能会导致编译时间较长。
为了解决这个问题,先安装 Microsoft Visual C++ Build Tools: https://visualstudio.microsoft.com/visual-cpp-build-tools/
安装后,请确保您已经将其添加到系统的环境变量中,以便编译器能够找到必要的文件。然后按照以下步骤安装 orderedset
库,管理员权限在命令行执行:
pip install wheel
pip install orderedset
Tk-inter 警告
Nuitka-Plugins:WARNING: Use ‘–enable-plugin=tk-inter’ for: Tkinter needs TCL included.
这个警告意味着你需要将--enable-plugin=tk-inter
作为参数传递给Nuitka来启用Tkinter插件。这是因为Tkinter需要TCL库的支持。
你可以尝试使用以下命令来打包你的程序:
nuitka --enable-plugin=tk-inter your_script.py
这将启用 Tkinter 插件并打包你的程序。
如果没有装 TCL 库,则可以查看并安装 TCL 库,官网:https://www.tcl.tk/ 下载来安装,一般 python 默认有了。
import tkinter as tk
输入以下代码来打印 Tkinter 使用的 TCL 版本:
print(tk.Tcl().eval('info patchlevel'))
# 我的版本是 8.6.12
去掉 py 脚本运行时控制台窗口显示
如果你想在双击 py
或 .pyc
文件运行时不显示控制台窗口,可以通过将文件更名为 .pyw
来实现,各种打包工具会有单独的控制台选项控制,比如 nuitka --windows-disable-console
, 这边不做描述。
.pyw
文件是 Python 的无控制台窗口版本,它会在后台运行,不显示任何窗口或控制台输出。
你可以使用以下步骤将 .pyc
文件更名为 .pyw
:
-
找到要更名的
.pyc
文件,例如script.pyc
。 -
将文件的扩展名
.pyc
更改为.pyw
,即将文件名更改为script.pyw
。 -
双击
.pyw
文件,它将在后台运行而不显示控制台窗口。
请注意,将 .pyc
文件更名为 .pyw
只是简单地去除了控制台窗口,但并不会对代码进行任何修改或加密。任何有经验的用户仍然可以访问和修改代码。如果需要更高级的保护措施,可以考虑使用其他加密工具或将代码打包为可执行文件。