Python代碼打包為單個可執(zhí)行文件實現(xiàn)過程
目前最常用的兩種方法是使用 Nuitka 和 PyInstaller
- PyInstaller:這是一個非常流行的工具,可以將Python腳本打包為單個可執(zhí)行文件,支持Windows、macOS和Linux。它還能夠自動檢測并包含大多數(shù)Python包和庫。優(yōu)點是簡單易用,缺點是在運(yùn)行時會釋放一堆臨時文件。
- Nuitka: 是將Python代碼編譯為C/C++代碼的編譯器,然后再使用C/C++編譯器生成可執(zhí)行文件。與其他打包工具相比,它能產(chǎn)生性能更優(yōu)的可執(zhí)行文件。優(yōu)點是打包后文件執(zhí)行效率高,缺點是打包速度慢且某些庫不兼容。
PyInstaller
1. 安裝
pip install pyinstaller
2. 基本用法
pyinstaller main.py pyinstaller --onefile main.py pyinstaller --onefile --name=hello main.py
3. 常用參數(shù)
| 參數(shù) | 說明 |
|---|---|
| --onefile | 將所有依賴打包成一個單獨的可執(zhí)行文件。沒有這個選項時,生成的可執(zhí)行文件將依賴于多個文件 |
| --windowed | 打包為 GUI 應(yīng)用程序,不顯示控制臺窗口(僅適用于 Windows 和 macOS) |
| --name | 指定生成的可執(zhí)行文件的名稱 |
| --icon | 為生成的可執(zhí)行文件指定圖標(biāo)文件。圖標(biāo)文件通常為 .ico(Windows)或 .icns(macOS)格式。 |
| --add-data | 添加額外的數(shù)據(jù)文件。格式為 source:destination,其中 source 是本地路徑,destination 是可執(zhí)行文件內(nèi)的路徑。 |
| --hidden-import | 手動指定需要包含的模塊。如果某些模塊在運(yùn)行時動態(tài)導(dǎo)入,PyInstaller 可能無法自動檢測到這些依賴項 |
| --exclude-module | 手動排除某些模塊 |
示例用法如下:
pyinstaller --onefile \
--windowed \
--name=my_program \
--icon=assets/app_icon.ico \
--add-data="resources/config.json;resources" \
--hidden-import=json \
main.py
4. 配置文件
PyInstaller 在首次運(yùn)行時會生成一個 .spec 文件,這個文件定義了打包的所有配置。你可以編輯這個文件來自定義打包過程。
在生成的 my_program.spec 文件中,你可以自定義一些高級選項,比如添加額外的數(shù)據(jù)文件、指定打包目錄等。
例如,添加一個額外的數(shù)據(jù)文件到 datas 列表中:
datas=[('data_folder/*', 'data')]
使用自定義的 .spec 文件進(jìn)行打包:
pyinstaller my_program.spec
5. 常見問題
pyinstaller 執(zhí)行后報錯通常為以下類似問題,手動導(dǎo)入模塊即可解決
# 未正常導(dǎo)入:Crypto.Cipher.PKCS1_v1_5 ImportError: cannot import name 'PKCS1_v1_5' from 'Crypto.Cipher' # 未正常導(dǎo)入:Crypto.PublicKey.RSA ImportError: cannot import name 'RSA' from 'Crypto.PublicKey' # 未正常導(dǎo)入:boto3 ModuleNotFoundError: No module named 'boto3' # 未正常導(dǎo)入:tqdm ModuleNotFoundError: No module named 'tqdm'
Nuitka
1. 安裝
pip install nuitka
同時確保安裝了 C 編譯器,如 gcc(Linux)、clang(macOS)、msvc(Windows)或者 MinGW-w64(Windows)。
在 Windows 上,建議使用 MinGW-w64。
2. 打包命令
nuitka --standalone main.py # 使用pandas nuitka --standalone --onefile --plugin-enable=pandas script.py # 使用tkinter、numpy nuitka --standalone --follow-imports --plugin-enable=tk-inter --plugin-enable=numpy example.py # 打包為單文件 nuitka --standalone --onefile --show-progress --lto=yes script.py
3. 常用參數(shù)
--standalone:生成一個包含所有依賴的目錄--onefile:將所有內(nèi)容打包成一個單一的可執(zhí)行文件,pip install zstandard 可減小大小--follow-imports:自動導(dǎo)入所需模塊--plugin-enable:用于啟用特定的編譯插件,例如:tkinter、PyQt5、Numpy等--show-progress:展示打包進(jìn)度--windows-icon:指定程序圖標(biāo)--windows-disable-console:去掉控制臺窗口--lto=yes:啟用鏈接時優(yōu)化(Link Time Optimization),可以生成更小、更快的二進(jìn)制文件。
4. 其他用途
編譯 .py 文件為 .pyd
nuitka --module your_script.py
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)動態(tài)添加類的屬性或成員函數(shù)的解決方法
這篇文章主要介紹了Python實現(xiàn)動態(tài)添加類的屬性或成員函數(shù)的解決方法,在類似插件開發(fā)的時候會比較有用,需要的朋友可以參考下2014-07-07
python實現(xiàn)PyEMD經(jīng)驗?zāi)B(tài)分解殘差量分析
這篇文章主要為大家介紹了PyEMD經(jīng)驗?zāi)B(tài)分解及變體殘余量分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之哈夫曼樹篇
這篇文章主要給大家介紹了關(guān)于Python描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之哈夫曼樹篇的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
人工智能學(xué)習(xí)pyTorch自建數(shù)據(jù)集及可視化結(jié)果實現(xiàn)過程
這篇文章主要為大家介紹了人工智能學(xué)習(xí)pyTorch自建數(shù)據(jù)集及可視化結(jié)果的實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
python讀取txt文件并取其某一列數(shù)據(jù)的示例
今天小編就為大家分享一篇python讀取txt文件并取其某一列數(shù)據(jù)的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
淺談keras中l(wèi)oss與val_loss的關(guān)系
這篇文章主要介紹了淺談keras中l(wèi)oss與val_loss的關(guān)系,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python中實現(xiàn)帶權(quán)重的隨機(jī)測試
本文主要介紹了Python中實現(xiàn)帶權(quán)重的隨機(jī)測試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-05-05

