RFC-0129:Fuchsia 中的 Python 支持

RFC-0129:Fuchsia 中的 Python 支持
状态已接受
区域
  • 治理
说明

定义 Fuchsia 项目中 Python 源代码的版本控制和脚本要求。

问题
Gerrit 更改
作者
审核人
提交日期(年-月-日)2021-06-15
审核日期(年-月-日)2021-09-24

摘要

此 RFC 定义了 Fuchsia 项目中 Python 源代码的 Python 版本控制和脚本要求。

设计初衷

在宿主机上,树中的所有 Python 脚本并非都以确定性方式执行。有些脚本假定使用供应商提供的预构建解释器,而有些脚本则使用系统 Python。此外,每种脚本支持的 Python 版本并不一致。

由于缺少确定性的 Python 环境,因此在进行环境更改(例如移除 /usr/bin/python 符号链接)时,脚本有时会中断。这要求用户将本地环境恢复为预期状态,或者对相关脚本进行本地修改,使其与其环境兼容。

最后,自 2020 年 1 月 1 日起,python.org 已正式弃用 Python 2.x。

设计

这种设计会将用户的本地主机环境替换为适用于所有 Fuchsia Project Python 源代码的供应商预构建 Python 解释器。此供应商提供的 Python 必须是受支持的 Python 语言修订版。

当前的供应商提供的 Python 版本应保持在当前 python.org 支持期限内。随着 Python 版本的更新,我们会提供合理的过渡期,以便源代码与新语言版本保持兼容。

对于 Fuchsia 项目 Python 源代码,此 RFC 会终止对低于 3.8 的 Python 语言版本的支持

  • 从此,Python 2.7 已废弃。
  • 无需向后兼容 3.8 之前的版本。

将 Python 源代码作为脚本

您可以通过多种方式将 Python 源文件作为脚本调用,例如在命令行上调用该文件,或将其作为参数提供给 Python 解释器调用。脚本由模块 __name__ 设置为 "__main__" 的运行时环境表示。

可执行的 Python 源必须延迟到供应商提供的 Python 以进行执行。这可以通过不同的方式实现:

  • 通过文档,指示用户直接调用供应商提供的解释器,并将候选脚本作为解释器参数提供。
  • 使用封装脚本或其他包含足以调用解释器的逻辑的机制(例如使用 //scripts/hermetic-env 之类的工具)推迟到供应商提供的 Python。
  • 假设脚本解释器源指令(即 shebang),最终会导致使用供应商提供的解释器执行脚本。

Python Shebang

要直接调用的 Python 脚本必须包含最终引用供应商提供的 Python 的 shebang。应使用的适当 shebang 行为:

#!/usr/bin/env fuchsia-vendored-python

由于使用 shebang 意味着对主机环境有依赖项,因此我们有意选择此 shebang 来实现以下以密封为导向的目标:

  • 不太可能与用户主机环境中的现有工具、别名或宏冲突。
  • 不依赖于用户向其 $PATH 添加 //.jiri_root/bin 的顺序。

密封型 Python 环境

venvvpython 等工具可用于组装临时且密封的 Python 环境。安装的软件包是这些密封环境的本地软件包,不会影响本地系统安装基准。允许使用密封的 Python 工具,但必须确保这些工具派生自供应商提供的 Python。

Python VirtualEnv (venv)

您可以通过使用 -m venv my_venv 的参数调用供应商提供的 Python 解释器来实例化 venv。这将在本地目录 my_venv 中组装 venv。然后,您可以按照典型的 venv 使用方式激活 venv 并与之交互。允许安装 venv-local 软件包。

Chromium vpython

vpython 实用程序是另一种形式的密封 Python 环境管理器。它从 $PATH 获取其解释器,并假定第一个解释器的 --version 与输入 vpython.Spec protobuf 兼容。如需使用 vpython,请确保在调用 vpython 时在 $PATH 中配置了供应商提供的 Python。此外,vpython.Spec protobuf 必须反映当前支持的语言版本。允许使用 vpython wheel,前提是其符合当前受支持的语言版本。

实现

Fuchsia 项目代码库中的所有 Python 源代码都将在 2021 年第 3 季度末更新为语言版本 3.8。根据以下语义,那些要直接调用的源代码的 shebang 将指向供应商提供的 Python。

为方便将供应商提供的 Python 解释器用作 shebang 目标,系统会修改以下内容:

  1. 系统会向 //.jiri_root/bin 添加一个新的 fuchsia-vendored-python 符号链接,该链接会指向 //scripts/fuchsia-vendored-python
  2. 系统会向 //scripts 添加一个指向 //scripts/fuchsia-vendored-python3.8 的新 fuchsia-vendored-python 符号链接。
  3. fuchsia-vendored-python3.8 脚本将添加到 //scripts 中,并以以下方式实现:
#!/bin/bash
hermetic-env python3.8 "$@"

假设 //.jiri_root/bin 是主机环境的 PATH(假设的环境配置)之一,那么无论主机上安装了哪个版本的解释器,此操作都会调度到预构建的解释器。

如果 //.jiri_root/bin 不是主机环境路径的一部分,则需要将 //.jiri_root/bin/fuchsia-vendored-python 符号链接到适当的位置(例如 ~/bin 或类似位置)。

预计有时需要通过 //integration 引入新版 Python。具体操作步骤如下:

  1. 通过 //integration,将预构建的二进制文件下载并安装到相应位置。
  2. 将新的引导脚本(例如 fuchsia-vendored-python3.9)添加到 //scripts
  3. //scripts/fuchsia-vendored-python 符号链接移至新的引导脚本。
  4. (可选)删除旧的引导脚本。

性能

不适用

工效学设计

从人体工学角度来看,确定性的 Python 语言版本和供应商预构建的解释器会带来更舒适的体验。用户不会因依赖于其宿主环境而陷入各种问题。

向后兼容性

不再需要向后兼容 Python 语言版本 2.x,并且此 RFC 会终止对 Python 语言版本 2.x 的支持。此 RFC 旨在消除 Python 2 向后兼容性带来的维护负担。

安全注意事项

python.org 已将 Python 2.x 列为已弃用,并停止了所有维护工作,包括安全修复。Fuchsia 项目不再支持 Python 语言版本 2.x。

通过迁移到受维护的 Python 发行版(版本 3.8 及更高版本),以及在较新 Python 语言版本中对字节数组类型和字符数组类型进行更严格的类型化,可提高安全性。

此外,假定使用确切的预构建版本(而不是任意主机系统安装版本)可减少因版本偏差和本地安装变体而导致的维护负担和开发者挫败感。

隐私注意事项

不适用

测试

不适用

文档

以下文档需要更新,以反映此处的政策:

  • //docs/development/build/build_system/policies.md
  • //docs/development/languages/python/python_style.md
  • //docs/get-started/get_fuchsia_source.md

缺点、替代方案和未知情况

以向后不兼容的方式弃用编程语言修订版可能会在迁移期间造成问题。并非所有用户都会预料到这一变化,有些用户可能自己也还没有从 Python 2.x 迁移。

不过,业界已经意识到需要从 2.7 迁移到 Python 3.x 已有多年,因此这项变更并不意外。

在先技术和参考文档