大家好,我是唐叔。上次我們講解了 Python+Web構建桌面應用的最佳選擇 - Pywebview,那麼寫好的Python程序,如何在別人的電腦上運行?總不能要求每個人都安裝Python、配置環境吧?這時候,PyInstaller 就派上用場了。
文章目錄
- 一、PyInstaller 是什麼?
- 二、安裝PyInstaller
- 三、快速上手:打包第一個應用
- 3.1 基礎打包命令
- 3.2 打包為單個文件
- 3.3 隱藏命令行窗口
- 3.4 自定義應用圖標
- 四、進階技巧:優化與實戰
- 4.1 解決打包文件過大問題
- 4.2 多程序文件打包
- 4.3 靜態資源打包(如圖片、HTML)
- 五、總結
一、PyInstaller 是什麼?
PyInstaller 是一個強大的Python應用程序打包工具,它能將你的Python腳本及其所有依賴項(包括解釋器、模塊、庫等)打包成一個獨立的可執行文件(如.exe)。用户無需安裝Python,雙擊即可運行!
原理小貼士:PyInstaller 會遞歸分析你的代碼,找出所有被導入的模塊,確保所有依賴都被正確打包。
適用場景:
- 開發GUI桌面應用(如PyQt、Tkinter、pywebview)
- 製作小工具或腳本,供非技術人員使用
- 需要跨Windows、macOS、Linux分發Python程序
二、安裝PyInstaller
安裝非常簡單,只需一行命令:
pip install pyinstaller
建議在虛擬環境中安裝,避免污染全局環境。
三、快速上手:打包第一個應用
我們以一個簡單的 pywebview 示例為例:
import webview
if __name__ == '__main__':
webview.create_window('Demo', 'https://pyinstaller.org')
webview.start()
保存為 demo.py,接下來我們開始打包。
3.1 基礎打包命令
pyinstaller demo.py
執行後,會在當前目錄生成 dist 文件夾,裏面就是打包好的應用程序。你可以將整個 dist 文件夾發給別人使用。
3.2 打包為單個文件
如果你不想發整個文件夾,可以使用 -F 參數:
pyinstaller -F demo.py
這樣就會生成一個獨立的 .exe 文件,方便分發。
✅ 提示:
--onefile是-F的全稱,效果相同。
3.3 隱藏命令行窗口
如果你打包的是GUI程序,不希望出現命令行窗口,可以使用 -w 參數:
pyinstaller -F -w demo.py
✅ 提示:
-w、--windowed、--noconsole三者等價。
3.4 自定義應用圖標
使用 -i 參數可以指定圖標文件(需為 .ico 格式):
pyinstaller -F -w -i logo.ico demo.py
四、進階技巧:優化與實戰
4.1 解決打包文件過大問題
打包後文件太大?最常見的原因是打包了不必要的依賴。
方法一:手動排除冗餘模塊
例如,使用 pywebview 時,默認會打包 PyQt,導致體積暴增。我們可以手動排除:
pyinstaller -F -w --exclude-module PyQt6 demo.py
從186MB降到13.7MB,效果顯著!
方法二:使用獨立虛擬環境
如果你不確定哪些模塊是冗餘的,建議在乾淨的虛擬環境中打包:
python -m venv myenv
myenv\Scripts\activate # Windows
pip install pyinstaller pywebview
pyinstaller -F -w demo.py
這樣打包出來的文件只有10MB,更小,也更乾淨。
有關python獨立環境創建的詳細教程,唐叔後續將專門章節展開介紹,敬請期待。
4.2 多程序文件打包
如果你的項目有多個 .py 文件,不用擔心,PyInstaller 會自動遞歸分析依賴,並將其一併打包。
例如:
project/
├── demo.py
└── module/
└── asset.py
只需打包主文件:
pyinstaller -F -w demo.py
PyInstaller 會自動識別並打包 asset.py。
當然你也可以使用
--collect-submodules手動指定打包模塊,這裏就不展開了。
4.3 靜態資源打包(如圖片、HTML)
如果你的程序使用了外部文件(如圖片、HTML、配置文件),可以使用 --add-data 參數:
pyinstaller -F -w --add-data "index.html;." demo.py
需要注意: 在代碼中,你需要使用 pathlib 或 sys._MEIPASS 來正確獲取資源路徑:
import pathlib
folder = pathlib.Path(__file__).parent.resolve()
with open(folder / 'index.html', 'r', encoding='utf-8') as f:
html = f.read()
這樣就能在打包後正確讀取靜態文件了。未正確獲取資源路徑,可能會報錯:FileNotFoundError。
五、總結
PyInstaller 是Python開發者必備的打包工具,無論是GUI程序、命令行工具,還是帶資源文件的項目,它都能勝任。
本文要點回顧:
- 使用
-F打包為單文件,-w隱藏命令行 - 使用
-i自定義圖標 - 通過
--exclude-module或虛擬環境優化體積 - 使用
--add-data打包靜態資源
如果你正在學習Python桌面開發,或希望將自己的腳本分享給他人,PyInstaller 絕對是你的首選工具。