RFC-0129:Fuchsia 中的 Python 支持

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

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

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

摘要

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

设计初衷

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

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

最后,截至 2020 年 1 月 1 日,python.org 已正式 停止对 Python 2.x 的支持

设计

此设计将用户本地主机环境替换为所有 Fuchsia 项目 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 来执行。这可以通过不同的方式实现:

  • 通过文档,指示用户直接调用供应商提供的解释器,并将候选脚本作为解释器参数提供。
  • 使用封装脚本或其他机制遵循供应商提供的 Python,这些机制包含调用解释器的逻辑(例如使用类似 //scripts/hermetic-env 的内容)。
  • 假定脚本解释器源指令(即 Shebang),最终导致脚本使用供应商提供的解释器执行。

Python Shebang

旨在直接调用的 Python 脚本必须包含最终引用供应商提供的 Python 的 Shebang。要使用的相应 Shebang 行是:

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

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

  • 不太可能与用户主机环境中的现有工具、别名或宏发生冲突。
  • 与用户将 //.jiri_root/bin 添加到其 $PATH 的顺序无关。

密封 Python 环境

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

Python VirtualEnv (venv)

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

Chromium vpython

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

实现

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

为了方便将供应商提供的 Python 解释器作为 Shebang 目标,将修改以下内容:

  1. //.jiri_root/bin 中,将添加新的 fuchsia-vendored-python 符号链接 ,该链接指向 //scripts/fuchsia-vendored-python
  2. //scripts 中,将添加新的 fuchsia-vendored-python 符号链接,该链接 指向 //scripts/fuchsia-vendored-python3.8
  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. //scripts 添加新的引导脚本(例如 fuchsia-vendored-python3.9)。
  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,因此此更改不应出乎意料。

在先技术和参考资料