乐于分享
好东西不私藏

Nuitka:一个把 Python 源码翻译成 C(再用 C 编译器生成为二进制)的 Python 编译器

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 -m nuitka script.py
基本编译,加速但仍依赖 Python 环境
独立分发
–mode=standalone
生成 dist 文件夹,拷贝即可运行
单文件
–onefile
生成单个可执行(内部会解包到临时目录)
模块编译
–mode=module
生成 .so / .pyd 扩展模块
跟随导入
–follow-imports
把被导入的模块也一起编译
输出报告
–report=compilation-report.xml
生成编译报告,便于定位依赖问题
减少内存
–low-memory
编译时内存使用更低(但时间慢)

优点

  • • 相比纯解释执行,许多场景能获得真实的性能提升(尤其是紧算密集或模块化好的代码)。
  • • 支持把程序做成独立分发包,解决“目标机没有合适 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