RFC-0129:Fuchsia 中的 Python 支持

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

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

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

摘要

此 RFC 定义了适用于 Python 的 Python 版本控制和脚本要求 源代码。

设计初衷

在主机上,并非树中的所有 Python 脚本都是确定性地执行的 。一些脚本假定使用供应商提供的预构建解释器,另一些则由 系统 Python。此外,版本之间并没有一致性 对每个脚本的支持。

缺少确定性的 Python 环境会导致脚本偶尔 更改(例如移除 /usr/bin/python 符号链接)。这要求用户 将环境更改为预期状态,或者对脚本进行本地修改 与环境兼容。

最后,从 2020 年 1 月 1 日起,Python 2.x 日落时间: python.org

设计

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

当前供应商提供的 Python 版本应保持在 python.org 支持窗口。由于 Python 版本 会有一段合理的过渡期,以便用户能够 与新语言版本兼容。

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

  • Python 2.7 现已弃用。
  • 3.8 之前的版本不要求向后兼容。

以脚本形式使用 Python 源代码

Python 源文件可以作为脚本调用,例如,通过在 或者将其作为参数提供给 Python 调用 翻译。脚本由模块 已设置__name__ 等于 "__main__"

可执行 Python 源必须遵循供应商提供的 Python, 执行。这可以通过不同的方式实现:

  • 通过文档指导用户直接调用 解释器提供候选脚本作为解释器参数。
  • 使用封装脚本或其他机制,以遵循 包含足以调用解释器的逻辑(例如,使用 //scripts/hermetic-env)。
  • 假设有一条脚本解释器源指令(即 Shebang), 会导致使用供应商的解释器执行脚本。

Python Shebang

打算直接调用的 Python 脚本必须包含一个 Shebang, 最终会引用供应商提供的 Python。要使用的相应 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 的参数。这将在本地目录中组建 venv my_venv。然后,系统可能会根据典型模式启动 venv,并与之交互 。允许安装 venv-local 软件包。

Chromium vpython

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

实现

Fuchsia 项目代码库中的所有 Python 源代码都将更新为语言 版本 3.8。这些来源旨在 会根据 下面的语义说明。

为便于将供应商的 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 或类似位置)。

预计偶尔需要引入新的 Python 版本 经由//integration。此操作的过程非常简单:

  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+)以及更严格的字节和字符数组输入 更多类型。

此外,假设使用的是确切的预构建版本,而非任意的预编译版本 将减少维护工作量和开发者 导致用户体验不满。

隐私注意事项

不适用

测试

不适用

文档

需要更新以下文档以反映该政策:

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

缺点、替代方案和未知问题

以不向后兼容的方式弃用编程语言修订版本 可能会在迁移过程中出现问题并非所有用户都能预料到这一变化, 有些可能没有自行从 Python 2.x 迁移出来。

不过,业界已经意识到需要从 Python 2.7 迁移到 Python 3.x,这一变化应该并不意外。

先验技术和参考资料