大家好,我是唐叔。上次我們講解了 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()

Python之——打包工具pyinstaller的用法_冰河的技術博客_Python

保存為 demo.py,接下來我們開始打包。

3.1 基礎打包命令

pyinstaller demo.py

執行後,會在當前目錄生成 dist 文件夾,裏面就是打包好的應用程序。你可以將整個 dist 文件夾發給別人使用。

Python之——打包工具pyinstaller的用法_冰河的技術博客_Python_02

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

Python之——打包工具pyinstaller的用法_冰河的技術博客_webview_03

從186MB降到13.7MB,效果顯著!

方法二:使用獨立虛擬環境

如果你不確定哪些模塊是冗餘的,建議在乾淨的虛擬環境中打包:

python -m venv myenv
myenv\Scripts\activate  # Windows
pip install pyinstaller pywebview
pyinstaller -F -w demo.py

Python之——打包工具pyinstaller的用法_冰河的技術博客_webview_04

這樣打包出來的文件只有10MB,更小,也更乾淨。

有關python獨立環境創建的詳細教程,唐叔後續將專門章節展開介紹,敬請期待。

4.2 多程序文件打包

如果你的項目有多個 .py 文件,不用擔心,PyInstaller 會自動遞歸分析依賴,並將其一併打包。

例如:

project/
  ├── demo.py
  └── module/
      └── asset.py

只需打包主文件:

pyinstaller -F -w demo.py

Python之——打包工具pyinstaller的用法_冰河的技術博客_命令行_05

PyInstaller 會自動識別並打包 asset.py

當然你也可以使用 --collect-submodules 手動指定打包模塊,這裏就不展開了。

4.3 靜態資源打包(如圖片、HTML)

如果你的程序使用了外部文件(如圖片、HTML、配置文件),可以使用 --add-data 參數:

pyinstaller -F -w --add-data "index.html;." demo.py

需要注意: 在代碼中,你需要使用 pathlibsys._MEIPASS 來正確獲取資源路徑:

import pathlib
folder = pathlib.Path(__file__).parent.resolve()
with open(folder / 'index.html', 'r', encoding='utf-8') as f:
html = f.read()

這樣就能在打包後正確讀取靜態文件了。未正確獲取資源路徑,可能會報錯:FileNotFoundError

Python之——打包工具pyinstaller的用法_冰河的技術博客_命令行_06

五、總結

PyInstaller 是Python開發者必備的打包工具,無論是GUI程序、命令行工具,還是帶資源文件的項目,它都能勝任。

本文要點回顧

  • 使用 -F 打包為單文件,-w 隱藏命令行
  • 使用 -i 自定義圖標
  • 通過 --exclude-module 或虛擬環境優化體積
  • 使用 --add-data 打包靜態資源

如果你正在學習Python桌面開發,或希望將自己的腳本分享給他人,PyInstaller 絕對是你的首選工具。