教程Python

部署 Python 项目

Zeabur 支持多种类型的 Python 项目,包括但不限于以下:

如果您的源代码中有 app.pymain.py 等入口文件,Zeabur 也将自动启动。

NPM 支持

如果你的项目根目录有 package.json,Zeabur 会自动帮您安装 Node.js 和 NPM;如果你的 package.jsonbuild 脚本,Zeabur 会自动帮你运行 npm install && npm run build 编译产物。

如果需要更改编译的命令(如改运行 npm run build:dist),请参阅〈自定义编译与启动命令〉。

自定义入口文件

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 模式运行

Serverless

Zeabur 支持将 Python 项目部署为 serverless 项目。但是目前需要 opt-in。 请参考 启用 Serverless 页面启用 serverless 支持。

设置 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 其中之一。