Python 打包编译工具Pyinstaller 与 Nuitka 特性对比

Python 打包编译工具Pyinstaller 与 Nuitka 特性对比

文章目录

概要

当我们发布Python项目时,有时为了隔离运行环境的差异 或者 不希望以源码的形式发布,一种常用的方法是将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=yes main.py # nuitka 在打包时支持指定编译相关的特性,比pyinstaller更灵活

特性剖析

相同点

  • pyinstaller与nuitka均支持单文件/单目录打包,单文件打包出来的二进制文件相对单目录更“紧凑”,但是在运行时单文件的内存开销与单目录不相上下,甚至反超;
  • 单文件打包出来的二进制文件,运行时后台会同时驻留至少两个同名的进程(例如编译出来的是my_app.exe,启动后任务管理器里至少有两个my_app.exe 进程),其中一个内存开销明显比较小的是打包编译工具夹带的引导器(Bootstrap Loader),负责先把单文件解压到临时目录、设置运行环境(资源解压、环境管理、进程监控、权限管理等)后再启动真正的主进程。所以单文件产物运行时并非真正意义上的“单进程”。
  • 单文件打包出来的产物如果运行中崩溃,并且使能了进程崩溃后自动重启将会反复在临时目录里解压资源,最后会把磁盘写爆,但单目录产物运行时完全不存在这种问题,因为它目录里放的本身就是解压后的内容,并且运行时不需要,所以相对单文件产物来说运行更稳定,如果不是为了分发方便,更推荐by 目录打包编译;
  • 对于Python项目来说,只要安装了一个第三方模块,不管有没有在项目中import,都可能会影响到打包编译出来的固件大小,并且一般会使得打包编译的产物变大;(为什么是可能而不是一定,是根据第三方模块而定,像额外安装一个Cython就不会影响到打包编译出来的产物,但是安装airtest / numpy等就会有影响,即便在项目中没有用到)

差异点

  • 不管是打包成单文件还是单目录,pyinstaller的打包过程都明显比nuitka快,从打包编译的原理上也好理解,后者多了一道 先转码再编译 的过程;
  • Nuitka编译出来的产物(不管是单文件还是单目录,下同)理论上应该比Pyinstaller更精简,但是在笔者上面的示例项目中,nuitka编译出来的产物比Pyinstaller大了 ~1.5MB,经分析可能是因为项目并不是特别大,且不含GUI或者诸如OpenCV、paddleocr等大型第三方依赖,所以nuitka编译的优势没有体现出来;
  • 上面提到单文件打包出来的固件运行时会先解压到临时目录,Pyinstaller解压到了C盘下的%TEMP%/_MEI* 目录,nuitka打包时允许自定义临时目录的位置,但是均解决不了崩溃后资源回收的问题;
  • Pyinstaller打包出来的产物可以被反“打包”(可通过 pyinstxtractor 提取 pyc)反转码成Python源码,但nuitka几乎不可能实现反编译;
  • nuitka编译出来的产物运行效率完爆Pyinstaller打包出来的产物;
  • nuitka在打包编译的时候控制更灵活,可以控制编译行为,比如开启性能优化等;

最后来张对比图:

对比图

场景选型

  • 小型项目(SLOC < 1000),快速交付验证:pyinstaller
  • 中型项目(SLOC 1000~10000),带GUI / 图像处理 / 网络服务,
  • 大型项目(SLOC > 10000),优选nuitka。

总之,如果更注重高性能、安全性、防逆向、运行时资源消耗小、商业化,优选nuitka;如果追求快速迭代、生态成熟稳定、兼容性好,优选pyinstaller。

总结

PyInstaller 与 Nuitka 代表了 Python 打包领域的两种哲学:

  • PyInstaller 是“打包专家”——擅长整合现有资源,快速交付可用成果;
  • Nuitka 是“编译先锋”——致力于将 Python 提升至系统级语言的执行效率。
    对于大多数开发者而言,PyInstaller 是首选入门工具;而对于追求性能、安全与专业形象的团队,Nuitka 正逐渐成为下一代标准。

技术选型没有银弹,只有最适合业务场景的选择。理解工具本质,方能游刃有余。

Read more

Rust异步Web框架Axum的深入原理与高级用法

Rust异步Web框架Axum的深入原理与高级用法

Rust异步Web框架Axum的深入原理与高级用法 一、Axum框架的架构与核心组件 1.1 Axum框架的设计理念 💡Axum是基于Tokio异步运行时的Rust Web框架,由Tokio团队官方维护,具有以下核心设计理念: 1. 模块化与可扩展性:通过中间件、请求提取器和响应映射器等组件,实现高度模块化的架构,允许开发者根据需求灵活组合功能。 2. 类型安全:利用Rust的类型系统确保请求处理逻辑的正确性,减少运行时错误。 3. 异步优先:完全基于Tokio异步运行时,充分利用现代硬件的并发能力。 4. 低门槛:提供简单易用的API,同时保持足够的灵活性,适合不同经验水平的开发者。 1.2 Axum框架的核心组件 1.2.1 请求提取器 请求提取器负责从HTTP请求中提取所需的数据,如路径参数、查询参数、请求体等。Axum提供了多种内置的请求提取器,并允许开发者自定义提取器。 内置请求提取器示例: useaxum::{extract::Path,response::IntoResponse,routing::get,

By Ne0inhk
Spring Boot 数据导入导出与报表生成

Spring Boot 数据导入导出与报表生成

Spring Boot 数据导入导出与报表生成 24.1 学习目标与重点提示 学习目标:掌握Spring Boot数据导入导出与报表生成的核心概念与使用方法,包括数据导入导出的定义与特点、Spring Boot与数据导入导出的集成、Spring Boot与数据导入导出的配置、Spring Boot与报表生成的基本方法、Spring Boot的实际应用场景,学会在实际开发中处理数据导入导出与报表生成问题。 重点:数据导入导出的定义与特点、Spring Boot与数据导入导出的集成、Spring Boot与数据导入导出的配置、Spring Boot与报表生成的基本方法、Spring Boot的实际应用场景。 24.2 数据导入导出概述 数据导入导出是Java开发中的重要组件。 24.2.1 数据导入导出的定义 定义:数据导入导出是指将数据从一个系统导入到另一个系统,或从一个系统导出到另一个系统的过程。 作用: * 实现数据的迁移。 * 实现数据的备份。 * 实现数据的共享。 常见的数据导入导出格式: * CSV:Comma-Separated Values,逗号分

By Ne0inhk
Flutter 第三方库 spa 的鸿蒙适配实战 - 打造单页应用架构、动态渲染路由状态及鸿蒙大屏多窗体验优化方案

Flutter 第三方库 spa 的鸿蒙适配实战 - 打造单页应用架构、动态渲染路由状态及鸿蒙大屏多窗体验优化方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 第三方库 spa 的鸿蒙适配实战 - 打造单页应用架构、动态渲染路由状态及鸿蒙大屏多窗体验优化方案 前言 随着移动端交互的日益复杂,用户对 App 的流畅度要求已不仅仅停留在“帧率”上,更多的是关于页面切换的“无缝感”。单页应用(Single Page Application, SPA)模式,通过在一个长生命周期的视图内动态替换内容节点,有效地避免了频繁的页面推栈(Push/Pop)带来的布局重绘开销。 spa 库是 Flutter 生态中一个非常独特且高效的路由增强工具。它将路由状态抽象为一套可观察的树状结构,让开发者能像管理 Web 应用一样管理 Flutter 的页面状态。 在鸿蒙系统(OpenHarmony)适配实战中,面对折叠屏的灵活切换和平板的多窗协同,spa 提供了一种天然的“响应式分发”基座。

By Ne0inhk
【前端进阶之旅】2026 年 5 个最佳 React UI 库

【前端进阶之旅】2026 年 5 个最佳 React UI 库

文章目录 * 前言 * 一、2026 年领先的 React.js UI Libraries * 1. Material-UI(MUI):持续领跑的王者 * 2. Shadcn UI:年度最大黑马 * 3. Ant Design:功能全面、适应性极强的 UI 库 * 4. Chakra UI:以 Accessibility 和易用性为核心 * 5. HeroUI:美观、快速、现代 * 6. (Bonus)Headless UI:Tailwind 的最佳搭档 * 总结 前言 在 React UI 库的世界里,又迎来了充满新变化的一年。如果你一直关注这个领域,就会知道

By Ne0inhk