使用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
英文地址,請注明出處:http://en.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…