PEP 775 – 使 zlib 成为构建 CPython 的必需项
- 作者:
- Gregory P. Smith <greg at krypto.org>, Stan Ulbrych <stanulbrych at gmail.com>, Petr Viktorin <encukou at gmail.com>
- 讨论至:
- Discourse 帖子
- 状态:
- 已撤回
- 类型:
- 标准跟踪
- 创建日期:
- 2025年2月24日
- Python 版本:
- 3.14
- 发布历史:
- 2023年1月23日, 2025年3月1日
摘要
将不再支持在没有 zlib 压缩库的情况下构建 CPython,并且 zlib
模块将成为标准库的必需项。唯一的例外是 WASI,因为 zlib 目前在 WASI 上的 CPython 中不受支持。在没有 zlib 的情况下构建解释器可能仍然是可能的,但正式不受支持。
PEP 撤回
此 PEP 已于 2025-05-07 被作者撤回。经过进一步反思,我们意识到它没有提供足够的价值,并且遭到了大量的负面反馈,尤其是在提议的 WASI 例外方面。
动机
zlib 库为 zlib
Python 模块提供支持,该库在除 WASI 以外的所有支持的系统上均可用。
PyPI 上的许多 wheel,包括 pip 安装程序,都需要 zlib。pip 用户会认为没有 zlib 的 CPython 是损坏的,但他们大多没有注意到,因为所有主流 CPython 构建都包含 zlib。
CPython 开发者也几乎没有注意到。事实证明,在撰写本文时,至少有一个 CPython 测试在没有 zlib 的情况下会失败(test_peg_generator.test_c_parser
中的“skip”装饰器应用得太晚了),但我们的 CI 没有捕获到这一点。
此 PEP 将此视为文档和消息传递中的一个问题。实际上,我们已经不支持在没有 zlib 的情况下构建 CPython;我们应该就此明确说明。
基本原理
对于无 zlib 构建,存在可能的用例,例如嵌入和引导,以及一些未预见的场景。因此,我们不会移除对无 zlib 系统的支持;我们将标记它们为不受支持,并邀请受影响的用户进行自己的测试,或分享可以让我们重新考虑此决定的用例。
zlib 尚未在 WASI 平台上默认使用——主要是因为添加它在那里还没有成为优先事项。(请注意,Pyodide,WASI 的主要“实际”CPython 发行版,确实包含 zlib。)我们将此视为一个机会,继续测试没有 zlib 的平台,这样我们就不会无意中破坏目前不受支持的构建。
规范
在标准库模块中,如果它们为可选功能使用 zlib,那么在使用该功能时将引发 ImportError
。用于生成更“友好”错误消息或预检查 zlib 是否可用的代码将被删除。如果缺少 zlib,所有与 zlib 无关的功能仍然可以使用。
这会影响以下模块,以及更多通过依赖关系间接受影响的模块:
即使由于缺少 zlib 而无法使用,shutil.get_archive_formats()
仍将始终包含 zip
和 gztar
作为已注册的格式。
在 WASI 以外的平台上,当找不到 zlib 时,configure
脚本将发出警告。
在 WASI 以外的平台上,test_zlib
将会失败。所有其他测试将继续被跳过——即,@test.support.requires_zlib
的用法将保留,以惠及 WASI、不受支持的构建以及任何可能的恢复。
PEP 11 将被调整,将“不含 zlib 的系统(WASI 除外)”标记为不受支持。
向后兼容性
实际上,除了错误情况外,并没有重大变化——例如,在缺少 zlib 的情况下尝试使用 tar 压缩将引发 ImportError
而不是 CompressionError
。
安全隐患
未知。
如何教授此内容
我们不期望需要更改任何说明,因为 zlib 已经在所有相关上下文中可用。
参考实现
可以在 CPython 存储库的一个拉取请求中找到一个参考实现:python/cpython#130297
未来工作
未来,如果没有找到无 zlib 构建的用例,zlib 可能会被完全强制要求。为此所需的主要更改将是使 configure
脚本引发一个硬错误,并移除 @test.support.requires_zlib
。
版权
本文档置于公共领域或 CC0-1.0-Universal 许可证下,以更宽松者为准。
来源:https://github.com/python/peps/blob/main/peps/pep-0775.rst