Python 3.15.0 首个候选版本发布:现在该为 Wheels 做兼容性验证了

2026-08-04 45 预计阅读时间: 1 分钟
来源: blog.python.org AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

Python 3.15.0 candidate 1 已经到来。对普通应用开发者来说,这是一次提前发现依赖问题的机会;对库作者和构建基础设施维护者来说,摘要中的“Get those wheels rolling!”指向了更具体的任务:尽快验证源码包和二进制 Wheel,避免正式版本发布后用户才遇到安装失败。

为什么 Wheel 兼容性需要提前检查

纯 Python 包通常更容易跨版本运行,但只要项目包含 C/C++、Rust 或 Cython 扩展,新的 Python 版本就可能暴露编译错误、已移除接口、ABI 假设或构建工具不兼容等问题。

候选版本阶段适合检查三层兼容性:

  • 源码兼容性:代码能否在 Python 3.15 下导入并通过测试。
  • 构建兼容性pipbuild、后端构建工具和原生编译器能否生成发行包。
  • 分发兼容性:生成的 Wheel 标签、平台架构和依赖声明是否正确,用户能否直接安装。

这里需要区分“项目测试通过”和“Wheel 可用”。测试可能一直在源码目录中运行,却没有覆盖隔离构建、打包后的文件清单和全新环境安装。候选版本验证应把这些步骤串起来。

可以这样实践:在隔离环境中完成构建与安装

下面是一套可以直接改造的本地检查流程。请将 python3.15 替换为候选版本解释器的实际命令;如果本机尚未安装该版本,可以在 CI 或容器环境中执行等价步骤。

set -eux

python3.15 -m venv .venv315
. .venv315/bin/activate

python -m pip install --upgrade pip build twine
python -m build
python -m twine check dist/*

# 强制从本次生成的 Wheel 安装,避免误用源码目录。
python -m pip install --force-reinstall dist/*.whl
python -m pip check
python -c "import your_package; print(your_package.__file__)"

运行前需要把 your_package 改成项目真实的导入名。若 dist/ 中同时存在多个平台或 Python 版本的 Wheel,应显式指定当前 Python 3.15 对应的文件,而不是依赖通配符。

还应在项目目录之外执行一次测试,确认导入的是已安装产物,而不是工作区源码:

set -eux

TMP_DIR="$(mktemp -d)"
cd "$TMP_DIR"
/path/to/project/.venv315/bin/python -c \
  "import your_package; print(your_package.__file__)"

对于包含原生扩展的项目,可以进一步禁止 pip 回退到源码构建,从而确认 Wheel 确实可安装:

python -m pip install \
  --only-binary=:all: \
  --no-index \
  --find-links=dist \
  your-distribution-name

其中 your-distribution-name 是发布到包索引时使用的发行名称,它可能与 Python 的导入名不同。

把 Python 3.15 加入 CI,但先允许试验性失败

来源没有给出特定 CI 平台或镜像名称,因此下面是一个可按项目环境调整的 GitHub Actions 示例。它假设运行器已经能够通过 actions/setup-python 获取相应的 3.15 预发布解释器;实际可用性需要以执行时的平台支持为准。

name: Python 3.15 compatibility

on:
  workflow_dispatch:
  pull_request:

jobs:
  python315:
    runs-on: ubuntu-latest
    continue-on-error: true
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.15"
          allow-prereleases: true
          cache: pip
      - name: Install build and test tools
        run: python -m pip install --upgrade pip build pytest
      - name: Build distributions
        run: python -m build
      - name: Install the wheel
        run: python -m pip install dist/*.whl
      - name: Run tests outside the source tree
        run: |
          cd "$(mktemp -d)"
          python -m pytest "$GITHUB_WORKSPACE/tests"

continue-on-error: true 适合刚开始收集信号时使用,但不应永久保留。确认工具链和关键依赖已经支持 Python 3.15 后,应移除它,让兼容性回归真正阻止合并。

如果项目通过 cibuildwheel 构建跨平台二进制包,还需要等待或确认其 Python 3.15 标识与镜像支持,再将目标版本加入构建矩阵。不要猜测具体标识;以当前工具版本的文档和实际构建日志为准。

常见失败不只来自业务代码

遇到失败时,可以按构建链路定位,而不是立即修改应用代码:

  • pip install 阶段失败:检查构建后端、锁定版本以及依赖是否发布了兼容包。
  • 编译原生扩展失败:检查已废弃或移除的 CPython API、编译器参数和生成代码版本。
  • Wheel 构建成功但无法导入:检查动态库、平台标签和包文件清单。
  • 测试只在源码目录通过:检查遗漏的数据文件、模块或错误的打包配置。
  • 安装时退回源码包:使用 --only-binary=:all: 暴露 Wheel 覆盖缺口。

候选版本本身仍处在正式发布之前,因此不宜直接替换生产环境解释器。它更适合作为独立 CI 任务、预发布镜像或维护者工作站中的额外解释器。

发布前的维护清单

现在接入 Python 3.15 验证时,建议完成以下事项:

  • 在全新虚拟环境中运行完整测试,而不只测试核心模块。
  • 同时构建 sdist 和 Wheel,并用 twine check 检查元数据。
  • 从构建产物重新安装,在源码目录之外验证导入与测试。
  • 对原生扩展覆盖 Linux、macOS、Windows 以及项目实际支持的架构。
  • 检查依赖的 Python 版本声明,避免过早宣称支持或无意阻止安装。
  • 将发现的问题反馈给直接依赖和构建工具维护者,并附上最小复现与完整日志。

Python 3.15.0 candidate 1 的价值不在于催促生产升级,而在于给生态系统留出修复窗口。越早滚动构建 Wheels,正式版本发布时留给最终用户的安装意外就越少。


相关推荐