概要
当我们发布 Python 项目时,有时为了隔离运行环境的差异或者不希望以源码的形式发布,一种常用的方法是将 Python 项目打包/编译成二进制文件。打包编译的工具有很多,其中 PyInstaller 和 Nuitka 是目前最主流的两个工具。它们都能将 .py 文件打包成无需安装 Python 环境即可运行的二进制程序,但其底层机制、性能表现和适用场景存在显著差异。
结合实际的项目实践,本文从功能原理、特性异同、性能对比及实际选型建议等详细对比 PyInstaller 与 Nuitka 的核心特性,供参考以根据项目需求做出更合理的技术选型。
简介
PyInstaller
PyInstaller 是一个流行且成熟的 Python 打包工具,能将 Python 脚本及其依赖项(包括解释器、标准库、第三方包等)封装成单个可执行的二进制文件或目录结构。它通过分析字节码来静态追踪导入关系,并将所有必要资源捆绑到运行时环境中。
Nuitka
Nuitka(读作 努伊特卡)是一个真正意义上的 Python 编译器,它将 Python 代码转换为优化的 C/C++ 代码,再通过 gcc/msvc 等编译链编译链接成可执行文件。
Python 项目
提供一个 Python Project,Python 项目 SLOC(一个衡量项目源码量的指标——源码行数,统计时会刨除文档注释、空行、虚拟环境、非.py 文件等无效因素影响)2700+,属于中小型项目(一般代码量处于 1000~10000 的 Python Project 划分为中型项目),不含 GUI 相关依赖,文件结构形如:
|-- main.py # 项目入口文件
|-- settings.py # 项目运行设置
|-- framework # 项目核心
|-- basic # 项目基础文件
|-- release # 发布
|-- scripts # 其他脚本
|-- cis # CI/CD 相关
|-- venv # 项目虚拟环境
打包命令分别为:
# 执行下述命令前先 cd 到项目根目录下,并激活虚拟环境
# pyinstaller 与 nuitka 的安装均通过 pip install 直接安装即可,以 Windows 平台为例
# PyInstaller
# 打包成单文件
pyinstaller -F main.py --workpath .\release\build --distpath .\release\output --clean --specpath .\release\windows
# 打包成单目录
pyinstaller -D main.py --workpath .\release\build --distpath .\release\output --clean --specpath .\release\windows
# ps: pyinstaller 更常用的一种打包方式是指定.spec 文件打包
# Nuitka
# 打包成单文件
nuitka --onefile --windows-console=disable --follow-imports --output-dir=.\release\output --clean-cache=all --lto=yes main.py
# 打包成单目录
nuitka --standalone --windows-console=disable --follow-imports --output-dir=.\release\output --clean-cache=all --lto= main.py


