教學Python

部署 Python 專案

Zeabur 支援眾多類型的 Python 專案,包含但不限於這些:

如果你的原始碼底下有 app.py, main.py 等 entrypoint,Zeabur 也會自動啟動。

NPM 支援

如果你的專案根目錄有 package.json,Zeabur 會自動幫您安裝 Node.js 和 NPM;如果你的 package.jsonbuild script,Zeabur 會自動幫你執行 npm install && npm run build 編譯產物。

如果需要更改編譯的命令(如改執行 npm run build:dist),請參閱〈自訂編譯與啟動命令〉。

自訂 Entrypoint

Zeabur 預設會辨識 main.pyapp.pymanage.pyserver.pyapp/__init__.py 這些 Entrypoint,但如果你的 Entrypoint 不在上面列出的清單中,可以設定環境變數

ZBPACK_PYTHON_ENTRY=your-entrypoint.py

或者是在 zbpack.json 中加入以下設定:

{
    "python": {
        "entry": "your-entrypoint.py"
    }
}

這樣 Zeabur 就會以 your-entrypoint.py 作為 Python 的執行檔案。

如果你想部署 WSGI/ASGI 應用程式(比如 Django、Flask、FastAPI),且 entrypoint 是在 __init__.py 裡面,則必須寫出完整路徑(包含 __init__.py 在內):

# server/__init__.py
 
app = Flask(__name__)
ZBPACK_PYTHON_ENTRY=server/__init__.py

如果你的 entrypoint 在 __main__.py,亦需要寫出完整路徑:

# server/__main__.py
 
print("Hello!")
ZBPACK_PYTHON_ENTRY=server/__main__.py

自訂編譯和啟動命令

Zeabur 允許你使用環境變數或設定檔自訂 Python 的編譯和啟動命令。

「編譯命令」適合用在需要下載或編譯自訂產物(如 CSS、JavaScript 等等),或者是配置設定檔的情境。舉例來說,你想往 /etc 資料夾寫入設定檔,你可以設定環境變數

ZBPACK_BUILD_COMMAND=echo 'your-configuration' > /etc/somewhere

或者是在 zbpack.json 中加入以下設定:

{
    "build_command": "echo 'your-configuration' > /etc/somewhere"
}

你亦可以在這裡執行 npm 的命令。注意 Zeabur 只會在 專案根目錄package.json 的情況下安裝 Node.js 和 NPM,如果你的專案沒有 package.json,則不會有 npm 命令可用:

{
    "build_command": "npm install && npm run build:dist"
}

「啟動命令」則適合用在啟動 Python 應用程式時執行的情境,如在原有的命令基礎上加上 python3 migrate.py 來建立資料庫的 tables。舉例來說,你可以設定環境變數

ZBPACK_START_COMMAND="python3 migrate.py && _startup"

或者是在 zbpack.json 中加入以下設定:

{
    "start_command": "python3 migrate.py && _startup"
}

其中 _startup 是 Zeabur 原本的啟動命令(可以在 zbpack 查閱)。如果你有自訂 start_command_startup 必須在你的啟動命令中執行,否則不會啟動 Python 應用程式。

build_commandstart_command 均會使用 POSIX 相容的 shell 執行,所以你可以使用 && 串接多個命令,或者使用 ; 分隔多個命令。

網頁爬取

Playwright 支援

如果你的依賴清單(requirements.txtPipfilepyproject.toml⋯⋯)有宣告 playwright,Zeabur 會自動幫您準備好執行 Playwright 必要的環境。

注意 Playwright 應以 Headless 模式執行,通常預設就是如此。

Selenium 支援

如果你的依賴清單(requirements.txtPipfilepyproject.toml⋯⋯)有宣告 seleniumbaseselenium,Zeabur 會自動幫您準備好執行 Selenium 必要的環境。

注意 Selenium 應以 Headless 模式執行

設定 Python 的版本

Zeabur 預設使用 Python 3.10 作為執行環境,不過 Zeabur 會根據你專案設定的 Python 版本選擇執行環境,你也可以根據需要自訂執行環境。

在專案指定 Python 版本

「在專案指定 Python 版本」是比較通用的做法,在每個環境都能使用。

如果是 Pipenv請在 Pipfile 中指定 Python 版本

[requires]
python_version = "3.8"   # 在這裡指定 Python 版本

如果是 Poetry請在 pyproject.toml 中指定 Python 版本

[tool.poetry.dependencies]
python = "^3.8"  # 在這裡指定 Python 版本

如果是 PDM請在 pyproject.toml 中指定 requires-python

[project]
requires-python = ">= 3.8"  # 在這裡指定 Python 版本

如果是 Rye,則使用 rye pin 命令設定 Python 版本

rye pin 3.8  # 在這裡指定 Python 版本

在 Zeabur 指定 Python 版本

如果你使用的是傳統的 requirements.txt,或你需要在 Zeabur 覆蓋專案指定的 Python 版本,你可以在 zbpack.json 中指定 Python 版本。

{
    "python": {
        "version": "3.8"
    }
}

或者是使用 ZBPACK_PYTHON_VERSION 環境變數指定 Python 版本:

ZBPACK_PYTHON_VERSION=3.8

指定 Streamlit 執行檔案

如果你有安裝 streamlit 依賴,且檔名是 app.pymain.pystreamlit_app.py,Zeabur 預設會以 Streamlit 模式啟動你的應用程式。

不過假如檔名不是上面這三個,你可以在 zbpack.json 中指定檔名。比如你的 Streamlit 應用程式的檔名是 myapp.py

{
    "streamlit": {
        "entry": "myapp.py"
    }
}

這樣 Zeabur 就會以 Streamlit 模式啟動你的 myapp.py。你也可以使用環境變數 ZBPACK_STREAMLIT_ENTRY 指定檔名:

ZBPACK_STREAMLIT_ENTRY=myapp.py

自訂套件管理器

Zeabur 支援多種 Python 套件管理器:

Zeabur 會根據專案結構選擇最適合的套件管理器。如果你沒提交套件管理的 lockfile,且不能從專案結構明顯猜出這個專案使用的套件管理器,則 Zeabur 會選擇不安裝任何套件。此時,你可以選擇在 zbpack.json 中指定套件管理器:

{
    "python": {
        "package_manager": "pipenv"
    }
}

或者是使用環境變數 ZBPACK_PYTHON_PACKAGE_MANAGER 指定套件管理器:

ZBPACK_PYTHON_PACKAGE_MANAGER=pipenv

值可以是 pip, pipenv, poetry, pdm, rye, uv 其中一個。