Python將代碼打包為exe的6種主流方法全攻略
Python 代碼打包為 exe 全攻略(2025–2026 主流方案)
目前 Python 程序打包成 Windows 可執(zhí)行文件(.exe)的方案已經(jīng)非常成熟,主要有以下 6 種主流/常用的方式:
| 排名 | 工具名稱 | 是否打包解釋器 | 文件體積 | 啟動速度 | 兼容性 | 維護(hù)活躍度 | 推薦場景 | 難度 |
|---|---|---|---|---|---|---|---|---|
| 1 | PyInstaller | 是 | 中~大 | 較慢 | ★★★★★ | 非常活躍 | 幾乎所有場景首選 | ★★☆ |
| 2 | Nuitka | 編譯為 C → exe | 中~小 | 很快 | ★★★★☆ | 活躍 | 追求速度 & 體積小的項(xiàng)目 | ★★★ |
| 3 | PyOxidizer | Rust 打包 | 中~小 | 很快 | ★★★★ | 活躍 | 追求極致啟動速度 & 現(xiàn)代化 | ★★★★ |
| 4 | cx_Freeze | 是 | 中 | 較慢 | ★★★★ | 一般 | 簡單腳本、跨平臺需求 | ★★☆ |
| 5 | py2exe | 是 | 中~大 | 較慢 | ★★★ | 較少維護(hù) | 極老項(xiàng)目兼容(Python 3 支持一般) | ★★☆ |
| 6 | Shiv / PEX | 不打包,zipapp | 非常小 | 快 | ★★★★ | 活躍 | 命令行工具、分發(fā)給有 Python 環(huán)境的人 | ★★☆ |
2025–2026 最推薦的排序(按實(shí)際使用量與綜合體驗(yàn)):
- PyInstaller → 穩(wěn)定、生態(tài)好、文檔完善
- Nuitka → 性能更好、體積更?。◤?qiáng)烈推薦嘗試)
- PyOxidizer → 極致追求啟動速度與現(xiàn)代化
- cx_Freeze / Shiv(特定場景)
下面逐一詳細(xì)說明原理、步驟和常見坑。
1. PyInstaller(使用量最大,推薦入門首選)
原理:把 Python 解釋器 + 你的代碼 + 所有依賴打包到一個文件夾或單個 exe 文件中。運(yùn)行時會先解壓到臨時目錄,然后執(zhí)行。
基本步驟
# 1. 安裝 pip install pyinstaller # 2. 簡單打包(單個文件) pyinstaller -F your_script.py # 3. 常用參數(shù)組合(推薦) pyinstaller \ -F \ # 單文件 --noconsole \ # 無控制臺窗口(GUI程序) --icon=app.ico \ # 設(shè)置圖標(biāo) --add-data "images;images" \ # 附加文件夾(注意分號) --hidden-import=pkg_resources \ # 解決部分庫隱藏導(dǎo)入問題 --clean \ # 清理臨時文件 your_script.py
常見坑與解決方案
缺少模塊(ModuleNotFoundError)→ 加 --hidden-import=模塊名 或修改 .spec 文件
圖片、配置文件找不到→ 使用 sys._MEIPASS 獲取臨時解壓路徑
import sys
import os
def resource_path(relative_path):
"""獲取資源絕對路徑(打包前后兼容)"""
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)文件體積過大→ 使用 UPX 壓縮(--upx-dir)或排除不必要的依賴
殺毒軟件誤報→ 正常現(xiàn)象,建議用 --onedir 模式或提交白名單
2. Nuitka(性能更好、體積更?。?/h2>
原理
把 Python 代碼翻譯成 C 代碼,再編譯成機(jī)器碼。不依賴 Python 解釋器,啟動速度快,體積相對較小。
基本步驟
# 安裝(推薦使用最新版) pip install -U nuitka # 推薦打包命令 python -m nuitka \ --standalone \ --onefile \ # 單文件(推薦) --windows-disable-console \ # 無控制臺 --include-data-dir=images=images \ --plugin-enable=pylint-warnings \ --windows-icon-from-ico=app.ico \ your_script.py
優(yōu)點(diǎn)對比 PyInstaller
- 啟動速度明顯更快(接近原生 C 程序)
- 最終文件體積通常更小
- 不需要解壓到臨時目錄
缺點(diǎn)
- 編譯時間較長(首次幾分鐘)
- 對一些動態(tài)特性(eval、exec、某些 metaclass)支持不完美
3. PyOxidizer(現(xiàn)代化、啟動最快)
原理:使用 Rust 編寫,把 Python 解釋器 + 代碼嵌入到一個原生可執(zhí)行文件中,幾乎無解壓開銷。
基本步驟(2025 年推薦方式)
安裝 PyOxidizer
pip install pyoxidizer
創(chuàng)建項(xiàng)目
pyoxidizer init-executable myapp cd myapp
編輯 pyoxidizer.bzl(配置文件)
構(gòu)建
pyoxidizer build
特點(diǎn)
- 啟動速度極快(幾乎無冷啟動延遲)
- 支持嵌入資源、自定義 Python 解釋器
- 適合追求極致體驗(yàn)的桌面應(yīng)用
缺點(diǎn)
- 配置相對復(fù)雜
- 社區(qū)規(guī)模小于 PyInstaller
4. 快速對比總結(jié)表(2025–2026 實(shí)際體驗(yàn))
| 需求 | 首選工具 | 次選工具 | 備注 |
|---|---|---|---|
| 快速上手、生態(tài)好 | PyInstaller | cx_Freeze | 文檔最多、問題最容易搜到 |
| 追求啟動速度 & 體積 | Nuitka | PyOxidizer | Nuitka 更成熟,PyOxidizer 更現(xiàn)代 |
| 命令行工具、分發(fā)給運(yùn)維 | Shiv / PEX | PyInstaller | 不打包解釋器,體積最小 |
| GUI 程序,無控制臺 | PyInstaller -F --noconsole | Nuitka --onefile --windows-disable-console | — |
| 極致性能 | Nuitka / PyOxidizer | — | — |
5. 通用避坑指南(強(qiáng)烈建議收藏)
路徑問題(最常見坑)
- 永遠(yuǎn)不要用相對路徑
- 使用
resource_path()函數(shù)(見 PyInstaller 示例)
第三方庫兼容性
- PyQt5/PySide6 → 必須加
--hidden-import - pandas/numpy → 通常自動識別,但有時需加
--include-data-dir - tkinter → PyInstaller 一般沒問題,Nuitka 需要額外配置
圖標(biāo)不生效
- 必須是
.ico格式(Windows) - 建議 256×256 多尺寸 ico 文件
殺毒報毒
- 單文件模式最容易被報
- 建議用
--onedir模式分發(fā),或提交給殺毒廠商加白
版本管理
- 建議用虛擬環(huán)境打包
- 記錄
requirements.txt和 Python 版本
測試建議
- 在干凈的 Windows 虛擬機(jī)上測試(無 Python 環(huán)境)
- 測試不同殺毒軟件的表現(xiàn)
總結(jié):2025–2026 年打包推薦策略
- 普通腳本 / 小工具 → PyInstaller 單文件
- 對啟動速度有要求 → Nuitka(強(qiáng)烈推薦)
- 追求極致現(xiàn)代化 → PyOxidizer
- 命令行工具給別人用 → Shiv / PEX
- 老項(xiàng)目兼容 → cx_Freeze 或 py2exe
到此這篇關(guān)于Python將代碼打包為exe的6種主流方法全攻略的文章就介紹到這了,更多相關(guān)Python代碼打包為exe內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python運(yùn)算符的應(yīng)用超全面詳細(xì)教程
Python運(yùn)算符是為了實(shí)現(xiàn)數(shù)值或字符運(yùn)算的特殊符號。Python運(yùn)算符可以分為算術(shù)運(yùn)算符、邏輯運(yùn)算符、賦值運(yùn)算符、成員運(yùn)算符、身份運(yùn)算符、比較運(yùn)算符、三目運(yùn)算符等。接下來,我們就開始來學(xué)習(xí)這一堆符號吧2022-07-07
Python中bisect_left 函數(shù)實(shí)現(xiàn)高效插入與有序列表管理
Python的bisect_left函數(shù)通過二分查找高效定位有序列表插入位置,與bisect_right的區(qū)別在于處理重復(fù)元素時返回最左索引,感興趣的可以了解一下2025-06-06
Python時間差中seconds和total_seconds的區(qū)別詳解
今天小編就為大家分享一篇Python時間差中seconds和total_seconds的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
sklearn和keras的數(shù)據(jù)切分與交叉驗(yàn)證的實(shí)例詳解
這篇文章主要介紹了sklearn和keras的數(shù)據(jù)切分與交叉驗(yàn)證的實(shí)例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python??處理?Pandas?DataFrame?中的行和列
這篇文章主要介紹了Python處理Pandas?DataFrame中的行和列,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
TensorFlow實(shí)現(xiàn)iris數(shù)據(jù)集線性回歸
這篇文章主要介紹了TensorFlow實(shí)現(xiàn)iris數(shù)據(jù)集線性回歸,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
python matplotlib畫圖實(shí)例代碼分享
這篇文章主要介紹了python matplotlib畫圖實(shí)例代碼分享,具有一定借鑒價值,需要的朋友可以參考下2017-12-12

