使用Nuitka打包Python程序,编译为C提高执行效率

在 Python 的世界里,代码打包与发布一直是开发者关注的重要话题。前面我们介绍了Pyinstaller的使用,尽管 PyInstaller 是最常用的工具之一,但对于性能、安全性、兼容性有更高要求的项目,Nuitka 正迅速成为更优的选择。本文将全面介绍 Nuitka 的功能、使用方法、优势与实践技巧,帮助你掌握这一强大的 Python 编译工具。


关于 Nuitka

Nuitka 是一个将 Python 源码编译为 C/C++ 代码,并进一步生成原生可执行文件的工具。它兼容所有主流的 Python 版本(CPython 2.6 - 3.x),并可生成跨平台的独立可执行文件(支持 Windows、Linux、macOS)。

Nuitka 的主要特点包括:

  • 将 .py 文件编译为真正的机器码,而非简单封装 pyc
  • 提升运行性能(通常比原生 Python 更快)
  • 更好的代码混淆与保护机制
  • 生成不依赖 Python 解释器的可执行文件

Nuitka的优势

  1. 💨 提升执行效率
    因为 Python 被编译成了底层 C 语言,Nuitka 打包后的程序在多数场景下能获得 10%~500% 不等的性能提升,尤其是大量循环、数值计算等 CPU 密集型任务。

  2. 🔐 源码保护能力强
    不同于 PyInstaller 是将 .pyc 打包进去(仍可反编译),Nuitka 直接把 .py 编译为机器代码,无法被轻易还原为原始代码,极大增强了源码保护。

  3. 📦 真正脱离 Python 解释器
    使用 Nuitka 打包的程序可以在没有 Python 环境的机器上直接运行,适用于部署闭源商业项目、工具应用等。

  4. 📚 兼容性强,支持第三方库
    Nuitka 兼容大部分第三方库,如 requests, numpy, pandas, PyQt5, Tkinter, 等等,甚至支持 C 扩展模块与插件机制。


使用Nuitka

首先还是安装,nuitka的安装稍微麻烦些。由于Nuitka不具备直接编译功能,因此还需要安装C编译器:

  • Windows:安装 mingw(默认使用 Visual Studio Build Tools,太过庞大,嫌弃!)
  • Linux:确保已安装 gcc 和 g++
  • macOS:安装 clang,可通过 Xcode 安装

我这里使用的是windows,就安装mingw。这个包的下载都超级慢,我就直接放个网盘分享地址:

下载后解压,将其放到特定位置,然后配置环境变量即可。
在这里插入图片描述

最后通过pip命令即可安装

pip install nuitka -i https://pypi.mirrors.ustc.edu.cn/simple/

编写一个基本的GUI程序,这里就以前面写的计算器例子来演示,执行打包

nuitka --mingw --standalone --onefile main.py

提示安装组件

完成第一阶段的编译后,又提示还需要安装一个 winlibs 包,这个也是编译需要的依赖包。我就一起放在上面的分享目录中了。注意看提示的内容,如果你的版本和我不一致的话,可以复制该链接,然后使用迅雷下载,放到上面指定的目录里面就行。

注: 将下载的压缩包内的mingw64文件夹复制到C:\Users\usename\AppData\Local\Nuitka\Nuitka\Cache\downloads\gcc\x86_64\14.2.0posix-19.1.1-12.0.0-msvcrt-r2中,这里原本是个空文件夹

【添加包】

系统提示需要添加tk-inter包进去,修改一下命令后再执行:

nuitka --mingw  --standalone --onefile --enable-plugin=tk-inter main.py

打包成功并运行

可以看到,使用功能Nuitka打包的程序仅5M大小,比Pyinstaller又小了2M的体积。

和pyinstaller一样,默认会启动一个控制台,也没有图标,下面我们来优化打包命令

优化打包

将打包命令修改为如下:

nuitka --mingw  --standalone --onefile  --windows-console-mode=disable --enable-plugin=tk-inter --include-data-file=logo.png=logo.png --windows-icon-from-ico=logo.ico main.py

说明:

  • mingw:使用 MinGW 作为 C 编译器
  • standalone: 打包所有依赖,无需 Python 环境
  • onefile:生成单个可执行文件
  • windows-console-mode:是否需要关闭控制台
  • enable-plugin=tk-inter:启用插件(例如 GUI 框架支持)
  • include-data-file:附加文件到打包文件中,否则无法显示图标
  • windows-icon-from-ico 程序图标设置

现在就能看到最终的效果了,程序程序图标也出来了,运行正常
在这里插入图片描述

Nuitka的打包过程没有生成配置文件,对于复杂的打包,建议写成脚本来执行

总结

使用Nuitka打包的程序体积会更小些,这是因为编译为C代码的缘故。不过编译时间会更久,对于大型项目尤其明显,我之前公司项目使用这个编译,每次都要3~5分钟。

安装过程相比pyinstaller稍微麻烦一点,不过这不是问题。

多学习一种打包方式,对于以后得工作总是有帮助的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84458.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于机器学习的恶意请求检测

好久没写文章了,忙毕业设计ING,终于做好了发出来。 做了针对恶意URL的检测,改进了杨老师这篇参考文献的恶意请求检测的方法 [网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习-CSDN博客 选择使用了XGBoost算法进…

深入理解XGBoost(何龙 著)学习笔记(五)

深入理解XGBoost(何龙 著)学习笔记(五) 本文接上一篇,内容为线性回归,介绍三部分,首先介绍了"模型评估”,然后分别提供了线性回归的模型代码:scikit-learn的Linear…

工业级MySQL基准测试专家指南

工业级MySQL基准测试专家指南 一、深度风险识别增强版 风险类型典型表现进阶检测方案K8s存储性能抖动PVC卷IOPS骤降50%使用kubestone进行CSI驱动压力测试HTAP读写冲突OLAP查询导致OLTP事务超时用TPCH+Sysbench混合负载测试冷热数据分层失效压缩表查询耗时激增10倍监控INNODB_C…

Spring WebFlux和Spring MVC的对比

原文网址:Spring WebFlux和Spring MVC的对比-CSDN博客 简介 本文介绍Spring WebFlux和Spring MVC的区别。 Webflux:是异步非阻塞的(IO多路复用),基于Netty。适合网络转发类的应用,比如:网关。…

解析401 Token过期自动刷新机制:Kotlin全栈实现指南

在现代Web应用中,Token过期导致的401错误是影响用户体验的关键问题。本文将手把手实现一套完整的Token自动刷新机制,覆盖从原理到实战的全过程。 一、为什么需要Token自动刷新? 当用户使用应用时,会遇到两种典型场景:…

《解构线性数据结构的核心骨架:从存储模型到操作范式的深度解析》

线性数据结构概述 线性数据结构是数据元素按线性顺序排列的集合,每个元素有唯一的前驱和后继(除首尾元素)。常见类型包括数组、队列、链表和栈,每种结构在存储和操作上具有独特特性。 线性表:顾名思义,线性表就是数据排成像一条线的结构。每个线性表上的数据最多只有前和后…

HW蓝队工作流程

HW蓝队工作流程 由多领域安全专家组成攻击队,在保障业务系统安全的前提下,直接在真实网络环境开展对抗,对参演单位目标系进行可控、可审计的网络安全实战攻击,通过攻防演习检验参演单位的安全防护和应急处置能力,提高…

语音相关-浏览器的自动播放策略研究和websocket研究

策略详情 媒体参与度 AudioContext音频API的实现 new Audio音频API的实现 相关实践 网页端 使用new Audio创建的音频对象进行音频播放的时候,如果用户没有与页面进行交互,那么会报错如下: 使用AudioContext创建的对象播放音频,…

Linux操作系统网络服务模块一DHCP服务概述

前言: 在Linux网络服务体系架构中,​DHCP(Dynamic Host Configuration Protocol)​​ 作为核心服务之一,承担着局域网内主机网络参数动态分配的关键任务。其设计初衷是解决传统手动配置IP地址的效率瓶颈与错误风…

FPGA基础 -- Verilog语言要素之变量类型

Verilog 变量类型(Variable Types) 一、什么是变量类型? 在 Verilog 中,变量类型用于保存过程赋值结果(由 always 或 initial 块赋值),通常用于建模寄存器、状态、计数器等“带记忆”的硬件行为…

使用Haporxy搭建Web群集

目录 一、案例分析 1.案例概述 2.案例前置知识点 2.1 HTTP请求 2.2 负载均衡常用调度算法 2.3常见的Web群集调度器 3.案例环境 3.1本案例环境 二、案例实施 1.搭建两台web服务器 2.安装Haproxy 3.haproxy服务器配置 修改haproxy的配置文件 4.测试web群集 5.haproxy的日…

pikachu靶场通关笔记38 目录遍历(路径遍历)

目录 一、目录遍历 二、源码分析 三、目录遍历与文件包含 四、实战渗透 1、进入靶场 2、目录遍历 (1)访问ace.min.css (2)访问fileinclude.php 本系列为《pikachu靶场通关笔记》渗透实战,本文通过对目录遍历源…

现代C++:std::string全方位碾压C字符串

在 C 中引入的 std::string 是对 C 语言中 char* 和 const char* 的一种现代化封装和增强。它不仅解决了 C 字符串的许多缺陷(如安全性、内存管理、易用性等),还提供了丰富的 API 来简化字符串操作。本文将从多个维度详细对比 std::string 与…

20250619周四:Atlassian

今天主要把conference上的A xxx的所有资料大体看了一遍,花了两个多小时。 公司的这个conference系统,共实就是一个大型的可多人在线编辑的文件系统。差不多所有的资料都共享在上面。这对于多人参与的项目管理,还是相当方便的。 Atlassian最特…

通过CDH安装Spark的详细指南

通过CDH安装Spark的详细指南 简介 Cloudera Distribution of Hadoop (CDH) 是一个企业级的大数据平台,它集成了多个开源组件,包括Hadoop、Spark、Hive等。本文将详细介绍如何通过CDH安装和配置Spark。 前提条件 在开始安装之前,请确保满足以下条件: 已安装CDH集群具有管…

GitLab CVE-2025-5121 安全漏洞解决方案

本分分享极狐GitLab 补丁版本 18.0.2, 17.11.4, 17.10.8 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任…

【八股消消乐】Elasticsearch优化—检索Labubu

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

如何实现基于场景的接口自动化测试用例?

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 自动化本身是为了提高工作效率,不论选择何种框架,何种开发语言,我们最终想实现的效果,就是让大家用最少的代码&…

FreeRTOS 任务管理学习笔记

FreeRTOS 任务管理学习笔记 引言 本文档旨在通过在STM32微控制器上使用FreeRTOS来理解和实现任务管理。实验的重点是创建和管理多个任务、处理任务同步以及通过简单的硬件接口控制任务状态。 实验概述 实验涉及创建三个任务: LED1_Task: 每300毫秒切换一次LED。…

c++set和pair的使用

set是C中的一种关联容器,具有以下特点: 存储唯一元素(不允许重复) 元素自动排序(默认升序) 基于红黑树实现(平衡二叉搜索树) 插入、删除和查找的时间复杂度为O(log n) 前言 在C…