不如虎穴,焉得虎子,說明了 pyinstaller 要打包 macOS 的執行檔一定要在 macOS 環境運行。

為了支援多平台的 Python 應用打包(例如 Windows、macOS 和 Linux),我們可以使用 GitHub Actions 和 PyInstaller 配合使用。以下是一步步的詳細指南,介紹如何在 GitHub Actions 中設置自動化打包,生成適用於不同作業系統的可執行文件。

背景

講好久 Node.js 了,今天來點 Python 的東西。PyInstaller 是一個用於將 Python 應用程序打包為獨立可執行文件的工具。它支持 Windows、macOS 和 Linux,並且可以將 Python 程序轉換為可執行文件 (像是 .exe),讓使用者無需安裝 Python 解釋器也可以直接執行。

使用起來大概像這樣:

1# 安裝 PyInstaller
2pip install pyinstaller
3# 打包成單一可執行文件
4pyinstaller --onefile hello.py

一般情況下,我們需要在不同的操作系統上運行 PyInstaller 來生成對應的可執行文件。比如說 Windows 的 .exe 文件不能在 macOS 上生成。而且如果直接像上面這樣打包檔案會很大,所以大家通常會安裝虛擬環境,然後在虛擬環境中執行 PyInstaller 來打包 Python 應用。

這樣就需要在不同的環境中進行打包,並且需要手動處理和分發生成的可執行文件實在有夠麻煩,你還要為了打包的程式多買一台筆電。為了提高效率,我們可以使用 GitHub Actions 來自動化這個過程,並在不同的操作系統上自動打包 Python 應用。

今日範例程式:https://github.com/Edit-Mr/2024-GitHub-Actions/tree/main/21

準備工作

首先,請先準備一份你的 Python 文件。如果你還沒有,可以使用以下的範例代碼,這是一台簡單的計算機。

1def calculator():
2    print("Python 計算機")
3
4    while True:
5        formula = input("請輸入運算式 (輸入 'exit' 離開): ")
6
7        if formula.lower() == 'exit':
8            print("再見!")
9            break
10        try:
11            result = eval(formula)
12            print(f"結果:{result}")
13        except Exception as e:
14            print(f"錯誤:{e}")
15
16if __name__ == "__main__":
17    calculator()

跑起來效果大概像這樣:

1Python 計算機
2請輸入運算式 (輸入 'exit' 離開): 1+2*3
3結果: 7

設置 GitHub Actions

我們需要配置 GitHub Actions 來在不同的操作系統上運行 PyInstaller。以下是一個例子,展示了如何在 macOS、Windows 和 Linux 上自動化打包過程。

在你的 GitHub repository 中,創建一個新的工作流程文件。例如,在 .github/workflows 目錄下創建一個名為 build-multi-platform.yml 的文件,並添加以下內容:

1name: Build Multi-Platform
2
3on:
4    push:
5        branches:
6            - main
7    workflow_dispatch:
8
9jobs:
10    build:
11        strategy:
12            matrix:
13                os: [ubuntu-latest, macos-latest, windows-latest]
14                python-version: [3.11]
15
16        runs-on: ${{ matrix.os }}
17
18        steps:
19            - name: Checkout repository
20              uses: actions/checkout@v3
21
22            - name: Set up Python
23              uses: actions/setup-python@v3
24              with:
25                  python-version: ${{ matrix.python-version }}
26
27            - name: Install dependencies
28              run: |
29                  pip install pyinstaller
30
31            - name: Build application
32              run: |
33                  pyinstaller --onefile hello.py
34
35            - name: Archive artifacts
36              uses: actions/upload-artifact@v3
37              with:
38                  name: hello-executable-${{ matrix.os }}
39                  path: dist/hello${{ matrix.os == 'windows-latest' && '.exe' || '' }}

詳細步驟解析

  • Checkout repository: 檢出 GitHub repository 的代碼。
  • Set up Python: 安裝指定版本的 Python。
  • Install dependencies: 安裝 PyInstaller。
  • Build application: 使用 PyInstaller 打包 Python 應用,根據運行的操作系統環境變數來確定可執行文件的名稱和擴展名。
  • Archive artifacts: 上傳生成的可執行文件作為 GitHub Actions 的構建產物,供後續下載或分發使用。

測試和驗證

推送更改到 GitHub repository,然後檢查 GitHub Actions 頁面來確保工作流程成功運行。檢查生成的可執行文件是否能在對應的操作系統上正常運行。

小結

通過這篇教程,我們學會了如何在 GitHub Actions 中設置多平台的自動打包流程。這樣,我們可以在不同的操作系統上生成對應的可執行文件,並自動化打包和分發過程,提高了開發效率和應用的可用性。如果有任何問題或需要進一步的幫助,隨時告訴我!

毛哥EM

一位喜歡把簡單的事,做得不簡單的高三生。