Nuitka:一个把 Python 源码翻译成 C(再用 C 编译器生成为二进制)的 Python 编译器
什么是 Nuitka?它解决了哪些痛点
-
• 简单一句话:Nuitka 是一个把 Python 源码翻译成 C(再用 C 编译器生成为二进制)的 Python 编译器。 -
• 它解决了这些烦恼: -
• 运行慢?通过编译和各种优化能提升性能(部分场景能明显快很多)。 -
• 环境依赖麻烦?用 –standalone 可以把依赖拷进一个可分发文件夹,方便在目标机跑。 -
• 想发 exe 给非技术同学?–onefile 能打包成单文件(但调试时先用 standalone 更稳)。 -
• 想把模块做成扩展(so / pyd)?支持 –mode=module,把 Python 模块编译成扩展模块。 -
• 想在 CI / 发布流程里自动编译?有专门的 GitHub Action(Nuitka-Action)。
安装很简单(实操)
-
• 前提:需要标准 CPython(非 App Store 版本)、以及能用的 C 编译器(Windows 推荐 MSVC 或 MinGW64,Linux/macOS 用 gcc/clang)。 -
• 快速安装命令(绝大多数场景): -
• python -m pip install nuitka -
• 验证: -
• python -m nuitka –version
基本用法(几个常用命令)
-
• 把脚本编译成加速二进制(默认会生成带后缀的加速二进制): -
• python -m nuitka myscript.py -
• 把程序及其依赖打成可独立运行的目录(推荐先试这个): -
• python -m nuitka –mode=standalone myscript.py -
• 结果是 myscript.dist/ 目录,里面放各种 dll/so、库、可执行文件 -
• 打成单文件(可选,调试复杂): -
• python -m nuitka –onefile myscript.py -
• 编译模块为扩展(so/pyd): -
• python -m nuitka –mode=module some_module.py -
• 递归跟随导入(把引用的模块都编译进来): -
• python -m nuitka –follow-imports program.py -
• 多程序合并(Multidist,实验性):用 –main 多次指定入口,合并共享依赖
简单示例:把 hello.py 编译并运行
-
• 代码 hello.py: -
• def main(): print(“Hello”) ; if name==”main“: main() -
• 编译: -
• python -m nuitka hello.py -
• 运行生成的 hello.exe(Windows)或 hello.bin(Linux)
表格速览(常用选项对照)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
优点
-
• 相比纯解释执行,许多场景能获得真实的性能提升(尤其是紧算密集或模块化好的代码)。 -
• 支持把程序做成独立分发包,解决“目标机没有合适 Python 环境”问题。 -
• 灵活:支持 module/package/standalone/onefile、多入口等多种模式。 -
• 与 CPython 高度兼容,可以使用第三方库、C 扩展(注意兼容性)。 -
• 有成熟的 CI 集成(Nuitka-Action),且文档详尽。
缺点 / 陷阱
-
• 编译需要 C 编译环境:Windows/macOS/Linux 的差异和依赖繁琐,尤其跨平台部署要小心。 -
• onefile 解包导致路径、文件访问逻辑和普通运行不同(要用 compiled.containing_dir 或 sys.argv[0] 处理)。 -
• 某些动态导入、运行时 exec、手工改 sys.path 的代码,Nuitka 不一定能静态分析,需要手工 include。 -
• 编译过程可能占用大量内存,频繁编译建议用 ccache / clcache,或用 –jobs 控制并发。 -
• Windows 上生成可执行可能被部分杀软误报(商业版本提供解决方案)。
总结 —— 值得尝试,但别盲从
Nuitka 不只是一个“把 .py 变 exe”的工具,它是真正把 Python 翻成 C 再编译执行的编译器。对想提升性能、简化部署、把脚本产品化的开发者来说,Nuitka 是非常值得尝试的利器。但别把它当“万能钥匙”:复杂的打包/跨平台兼容、动态导入、系统库依赖这些场景仍需人工处理。我的建议:先把你的程序做好单元测试,先用 standalone 成功分发,再考虑 onefile 和性能优化。实践中你会发现它既能解决很多痛点,也会让你更懂程序的运行环境。
项目地址:https://github.com/Nuitka/Nuitka
夜雨聆风