停止支持旧版 Python

通过标准 核心元数据规范 1.2 规范中的 “Requires-Python” 属性,可以停止支持旧版 Python。

元数据 1.2+ 安装程序,例如 Pip,将遵守此规范,通过匹配当前 Python 运行时并将其与包元数据中所需的版本进行比较。如果它们不匹配,它将尝试安装支持该 Python 运行时的最后一个包分发。

通过修改包元数据中的 Requires-Python 属性,可以使用此机制停止支持旧版 Python。

要求

此工作流要求安装包的用户使用 Pip [1] 或其他支持元数据 1.2 规范的安装程序。

处理通用 Wheel

传统上,提供与 Python 2 和 Python 3 语义兼容的 Python 代码的 Setuptools 项目,会生成名称中带有 py2.py3 标签的 wheel。在停止支持 Python 2 时,重要的是不要忘记将此标签更改为仅 py3。它通常在 setup.cfg 文件中的 [bdist_wheel] 部分中配置,通过设置 universal = 1

如果您使用此方法,请删除此选项或部分,或将 universal 显式设置为 0

# setup.cfg

[bdist_wheel]
universal = 0  # Make the generated wheels have "py3" tag

提示

关于 已弃用 的直接 setup.py 调用,在命令行上传递 --universal 标志可能会覆盖此设置。

定义所需的 Python 版本

1. 安装 twine

确保您已安装最新版本的 twine。步骤

python3 -m pip install --upgrade twine
py -m pip install --upgrade twine

2. 为支持的 Python 分发指定版本范围

在项目的 pyproject.toml 中设置版本范围,声明支持哪些 Python 分发。requires-python 配置字段对应于 Requires-Python 核心元数据字段

[build-system]
...

[project]
requires-python = ">= 3.8" # At least Python 3.8

您可以指定版本范围和排除规则(符合 版本说明符 规范),例如至少 Python 3.9。或者,至少 Python 3.7 及更高版本,跳过 3.7.0 和 3.7.1 点版本

requires-python = ">= 3.9"
requires-python = ">= 3.7, != 3.7.0, != 3.7.1"

如果使用 Setuptools 构建后端,请查阅 依赖管理 文档以获取更多选项。

注意

避免在版本范围中添加上限,例如 ">= 3.8, < 3.10"。这样做可能会导致不同的错误和版本冲突。有关更多信息,请参阅 讨论

3. 发布前验证元数据

在 Python 源包(您下载的 zip 或 tar-gz 文件)中,有一个名为 PKG-INFO 的文本文件。

此文件由 构建后端 在生成源包时生成。该文件包含一组键和值,键列表是 PyPA 标准元数据格式的一部分。

您可以像这样查看生成文件的内容

tar xfO dist/my-package-1.0.0.tar.gz my-package-1.0.0/PKG-INFO

在发布包之前,验证以下内容是否已到位

  • 如果您已正确升级,则 Metadata-Version 值应为 1.2 或更高版本。

  • Requires-Python 字段已设置并与配置文件中的规范匹配。

4. 发布包

按照 将您的项目上传到 PyPI 中建议的步骤进行。

停止支持某个 Python 版本

原则上,至少应该尽可能长时间地保留对 Python 版本的元数据支持,因为一旦停止支持,仍然依赖该版本的人将被迫降级。但是,如果支持特定版本成为新功能或其他问题的障碍,则应修改元数据 Requires-Python。当然,这还取决于项目是否需要稳定并广泛覆盖更广泛的用户。

每次版本兼容性更改都应有自己的发布。

提示

在停止支持某个 Python 版本时,除了更新可见位置(如测试环境)中使用的版本外,全面升级项目代码语法也可能会有所收获。像 pyupgraderuff 这样的工具可以自动完成部分工作。