把 Python 脚本变成可执行文件,一直都是一个相对来说很大的需求。一方面是有人需要把自己写好的脚本进行混淆,另一方面是有人需要让程序在别的电脑上能跑,还有一类是要 Python 脚本以 C 的速度去跑。第一类人是典型的商业思维,尊重软件有自己的版权;第二类人是典型的开发者思维,尽量去把用户的事情做了;第三类人是典型的项目思维,要这个程序既要像 Python 那样好写,又要像 C 一样有速度。前者的思维可以和后者的思维共用一个软件——Nuitka,它可以把 Python 脚本编成 C 做的可执行文件;中间者的思维则需要用到另一个软件——PyInstaller,它可以把脚本连同需要的库都打包起来成一个可执行文件:

1
2
3
4
5
python3 -m venv .venv
.venv/bin/pip install pyinstaller nuitka

.venv/bin/pyinstaller -F main.py
.venv/bin/nuitka --output-filename=main --standalone main.py

PyInstaller 和 Nuitka 的工作原理截然不同:前者没有任何的编译过程,就是完完全全的打包,等需要运行的时候找个地方解压出来,这样就做到了既可以是静态也可以是依赖全;而后者是真的把 Python 脚本翻译成了 C 文件,最后再把这个链接了特殊库的 C 文件编译了,虽然也可以有选项做到打包所有内容,但本质依然是找个地方解压环境,只不过这次是解压 C 目录里的库。PyInstaller 虽然简单粗暴,但运行起来真的很费劲;Nuitka 虽然参数繁多,但最后编译出来的文件速度确实快。最后还是要看你的项目需求是什么,除非你接受得了 Musl 加 Python 的 PyInstaller……那还是老老实实地根据项目选更适配真实情况的工具吧!

最近我就在用 Nuitka 编译我的 Python 脚本,起因是我不想看到这些成坨的 AI 代码和注释。