文章目錄
- Nuitka 打包Python程序
- 🚀 **一、Nuitka 核心優勢**
- ?? **二、環境準備(Windows 示例)**
- 📦 **三、基礎打包命令**
- **單文件腳本打包**
- **帶第三方庫的項目**
- 🛠? **四、高級配置選項**
- **示例:完整命令**
- ?? **五、常見問題與解決**
- 📊 **六、Nuitka vs 其他工具**
- 💎 **七、最佳實踐建議**
- 💡 **八、使用舉例**
- 總結
Nuitka 打包Python程序
需要把Python寫的代碼打包給朋友,于是通過DeepSeek檢索了Nuitka的使用,之前用過pyinstaller,參考我的博客PySide6 GUI 學習筆記——Python文件編譯打包,這次我采用Nuitka打包一個簡單的程序。
以下是使用 Nuitka 將 Python 程序打包為獨立 EXE 文件的完整指南,結合核心優勢、詳細步驟和避坑技巧:
🚀 一、Nuitka 核心優勢
- 性能卓越
- 將 Python 編譯為 C++ 代碼,運行速度比傳統打包工具快 30%-300%。
- 支持 SIMD 指令集優化(如 AVX2/SSE4),適合高頻計算場景(金融量化、工業視覺)。
- 安全加固
- 三重防護機制:控制流扁平化、字符串常量加密(AES-256-CTR)、元數據混淆,大幅提高反編譯成本。
- 體積控制
- 基礎增量僅 2-5MB,支持 UPX 壓縮(體積減少 60%)。
- 跨平臺支持
- 兼容 Windows/macOS/Linux,完美支持 Python 3.4-3.13 和 Python 2.7。
?? 二、環境準備(Windows 示例)
- 安裝依賴
- Python 環境:推薦 Python 3.10+(需與目標環境一致)。
- C 編譯器:安裝 MinGW64(選擇
x86_64-posix-seh
版本),并添加C:\mingw64\bin
到系統 PATH。 - 驗證安裝:
pip install nuitka python -m nuitka --version # 輸出版本號即成功
📦 三、基礎打包命令
單文件腳本打包
python -m nuitka --standalone --onefile your_script.py
--standalone
:生成獨立 EXE(包含所有依賴)。--onefile
:輸出為單個 EXE 文件。- 輸出位置:生成
your_script.dist
目錄,內含 EXE 文件。
帶第三方庫的項目
python -m nuitka --standalone --onefile --include-package=numpy,requests app.py
--include-package
:顯式包含動態導入的庫(如numpy
、requests
)。
🛠? 四、高級配置選項
參數 | 作用 |
---|---|
--enable-plugin=tk-inter | 啟用 GUI 插件支持(如 Tkinter/PyQt) |
--windows-icon=app.ico | 設置 EXE 圖標(需 .ico 格式) |
--remove-output | 編譯后刪除臨時文件 |
--jobs=4 | 多線程編譯加速(根據 CPU 核心數調整) |
--lto=yes | 啟用鏈接時優化(提升運行效率) |
--disable-console | 隱藏控制臺窗口(適用于 GUI 程序) |
示例:完整命令
python -m nuitka --standalone --onefile --enable-plugin=pyqt5 --windows-icon=app.ico --jobs=4 app.py
?? 五、常見問題與解決
-
動態導入失敗
- 現象:
importlib.import_module("mod")
未包含依賴。 - 解決:添加
--include-package=mod
或--include-module=mod
。
- 現象:
-
殺毒軟件誤報
- 解決:編譯時添加數字簽名,或提交至殺毒軟件白名單。
-
大型庫(如 PyTorch)打包失敗
- 解決:顯式啟用插件和依賴:
python -m nuitka --standalone --include-module=torch._C --include-package=torch-static app.py
- 解決:顯式啟用插件和依賴:
-
編譯速度慢
- 優化:使用
--jobs=N
多線程編譯,或跳過調試信息--disable-console
。
- 優化:使用
📊 六、Nuitka vs 其他工具
特性 | Nuitka | PyInstaller | cx_Freeze |
---|---|---|---|
執行速度 | ????? (快 30-300%) | ?? | ??? |
加密強度 | ????? | ?? | ??? |
體積控制 | ???? (支持 UPX) | ?? | ??? |
依賴處理 | 智能分析依賴樹 | 需手動指定 | 需復雜配置 |
適用場景 | 商業分發/高性能計算 | 簡單腳本 | 高度自定義項目 |
💎 七、最佳實踐建議
-
使用虛擬環境
- 通過 Miniconda 創建隔離環境,避免冗余依賴:
conda create -n pack_env python=3.10 conda activate pack_env pip install nuitka pandas numpy
- 通過 Miniconda 創建隔離環境,避免冗余依賴:
-
分離資源文件
- 數據文件通過
--include-data-dir=res/;res/
打包,代碼內用sys._MEIPASS
訪問。
- 數據文件通過
-
敏感信息保護
- 結合 Cython 混合編譯核心模塊(先轉
.pyx
再編譯):
再用 Nuitka 打包主程序。# setup_cython.py from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize("secret_module.pyx"))
- 結合 Cython 混合編譯核心模塊(先轉
💡 八、使用舉例
我有一個名為google_click.py的文件,需要打包成exe文件,使用了如下的命令:
python -m nuitka --standalone --onefile --jobs=8 --output-dir=out --lto=
yes google_click.py
運行過程如下:
Nuitka-Options: Used command line options:
Nuitka-Options: --standalone --onefile --jobs=8 --output-dir=out --lto=yes google_click.py
Nuitka: Starting Python compilation with:
Nuitka: Version '2.7.10' on Python 3.12 (flavor 'Unknown') commercial grade 'not installed'.
Nuitka-Plugins:options-nanny: Using module 'trio._core._ki' (version 0.30.0) with incomplete support: Disabled careful
Nuitka-Plugins:options-nanny: handling of KeyboardInterrupt in 'trio'
Nuitka-Plugins:anti-bloat: Not including 'pandas.core._numba.extensions' automatically in order to avoid bloat, but this may
Nuitka-Plugins:anti-bloat: cause: no numba acceleration.
Nuitka: Completed Python level compilation and optimization.
Nuitka: Generating source code for C backend compiler.
Nuitka: Running data composer tool for optimal constant value handling.
Nuitka: Running C compilation via Scons.
Nuitka-Scons: Backend C compiler: cl (cl 14.3).
Nuitka-Scons: Backend C linking with 723 files (no progress information available for this stage).
Nuitka-Scons: Compiled 723 C files using clcache with 0 cache hits and 723 cache misses.
Nuitka-Plugins:dll-files: Found 1 file DLLs from selenium installation.
Nuitka will make use of Dependency Walker (https://dependencywalker.com) tool
to analyze the dependencies of Python extension modules.Is it OK to download and put it in 'C:\Users\yeshe\AppData\Local\Nuitka\Nuitka\Cache\DOWNLO~1\depends\x86_64'.Fully automatic, cached. Proceed and download? [Yes]/No : yes
Nuitka: Downloading 'https://dependencywalker.com/depends22_x64.zip'.
Nuitka: Extracting to 'C:\Users\yeshe\AppData\Local\Nuitka\Nuitka\Cache\DOWNLO~1\depends\x86_64\depends.exe'
Nuitka-Plugins:data-files: Included data file 'certifi\cacert.pem' due to package data for 'certifi'.
Nuitka-Plugins:data-files: Included data file 'pandas\io\formats\templates\html.tpl' due to package data directory 'templates'
Nuitka-Plugins:data-files: for 'pandas.io.formats'.
Nuitka-Plugins:data-files: Included data file 'pandas\io\formats\templates\html_style.tpl' due to package data directory
Nuitka-Plugins:data-files: 'templates' for 'pandas.io.formats'.
Nuitka-Plugins:data-files: Included data file 'pandas\io\formats\templates\html_table.tpl' due to package data directory
Nuitka-Plugins:data-files: 'templates' for 'pandas.io.formats'.
Nuitka-Plugins:data-files: Included data file 'pandas\io\formats\templates\latex.tpl' due to package data directory
Nuitka-Plugins:data-files: 'templates' for 'pandas.io.formats'.
Nuitka-Plugins:data-files: Included data file 'pandas\io\formats\templates\latex_longtable.tpl' due to package data directory
Nuitka-Plugins:data-files: 'templates' for 'pandas.io.formats'.
Nuitka-Plugins:data-files: Included data file 'pandas\io\formats\templates\latex_table.tpl' due to package data directory
Nuitka-Plugins:data-files: 'templates' for 'pandas.io.formats'.
Nuitka-Plugins:data-files: Included data file 'pandas\io\formats\templates\string.tpl' due to package data directory
Nuitka-Plugins:data-files: 'templates' for 'pandas.io.formats'.
Nuitka-Plugins:data-files: Included 604 data files due to package data directory 'zoneinfo' for 'pytz'.
Nuitka-Plugins:data-files: Included data file 'selenium\webdriver\common\mutation-listener.js' due to package data directory
Nuitka-Plugins:data-files: '.' for 'selenium'.
Nuitka-Plugins:data-files: Included data file 'selenium\webdriver\common\linux\selenium-manager' due to package data directory
Nuitka-Plugins:data-files: '.' for 'selenium'.
Nuitka-Plugins:data-files: Included data file 'selenium\webdriver\common\macos\selenium-manager' due to package data directory
Nuitka-Plugins:data-files: '.' for 'selenium'.
Nuitka-Plugins:data-files: Included data file 'selenium\webdriver\firefox\webdriver_prefs.json' due to package data directory
Nuitka-Plugins:data-files: '.' for 'selenium'.
Nuitka-Plugins:data-files: Included data file 'selenium\webdriver\remote\findElements.js' due to package data directory '.'
Nuitka-Plugins:data-files: for 'selenium'.
Nuitka-Plugins:data-files: Included data file 'selenium\webdriver\remote\getAttribute.js' due to package data directory '.'
Nuitka-Plugins:data-files: for 'selenium'.
Nuitka-Plugins:data-files: Included data file 'selenium\webdriver\remote\isDisplayed.js' due to package data directory '.' for
Nuitka-Plugins:data-files: 'selenium'.
Nuitka-Postprocessing: Creating single file from dist folder, this may take a while.
Nuitka-Onefile: Running bootstrap binary compilation via Scons.
Nuitka-Scons: Onefile C compiler: cl (cl 14.3).
Nuitka-Scons: Onefile C linking.
Nuitka-Scons: Compiled 1 C files using clcache with 0 cache hits and 1 cache misses.
Nuitka-Onefile: Using compression for onefile payload.
Nuitka-Onefile: Onefile payload compression ratio (24.35%) size 152398972 to 37107219.
Nuitka-Onefile: Keeping onefile build directory 'out\google_click.onefile-build'.
Nuitka: Keeping dist folder 'out\google_click.dist' for inspection, no need to use it.
Nuitka: Keeping build directory 'out\google_click.build'.
Nuitka: Successfully created 'D:\Source\Repos\Visual Studio Code\some_selenium_app\out\google_click.exe'.
我指定里一個out文件夾,生成的獨立運行文件放在了該文件夾中:
總結
Nuitka 憑借編譯級優化和工業級安全,已成為 Python 打包的首選方案,尤其適合:
- 🔒 商業軟件分發(防源碼泄露)
- ? 高頻計算場景(實時數據處理)
- 🔧 混合 C/C++ 項目(如深度學習框架集成)
命令模板:
python -m nuitka --standalone --onefile --enable-plugin=upx --jobs=4 --lto=yes app.py
遇到復雜依賴時,優先通過 --include-package
顯式聲明缺失模塊,并通過 Nuitka 官方文檔 查詢插件支持列表。