迁移到 Python 3 运行时

迁移到 Python 3 运行时后,您可以使用最新的语言功能,并构建可移植性更强的应用(具有惯用的代码)。Python 3 运行时使用 Python Software Foundation 提供的最新版开源 Python 解释器。在 Python 3 运行时中构建的应用可以通过在 requirements.txt 文件中声明依赖项,在应用中使用 Python 丰富的软件包和框架生态系统,包括那些使用 C 代码的应用。

运行时迁移过程概览

我们建议您采用以下增量式运行时迁移方法,借助此方法,您可以在迁移过程中维护一个功能齐全和可测试的应用:

  1. 升级您的应用,使其兼容 Python 2 和 Python 3。

    有几种解决方案可帮助您完成此次升级。例如,使用 SixPython-FuturePython-Modernize

    如需详细了解迁移过程的这一步,请参阅 Python Software Foundation 文档网站上的将 Python 2 代码移植到 Python 3

  2. 为应用使用的所有 App Engine 捆绑服务选择以下实现策略之一:

    1. 将 Python 2 应用中的 App Engine 捆绑服务迁移到未绑定 Google Cloud 服务、第三方服务或其他推荐的替代服务

    2. 继续在 Python 3 应用中使用旧版捆绑服务。这种方法可让您灵活地在迁移周期的后期迁移到非捆绑服务。

    请务必在迁移每项服务后测试您的应用。

  3. 为 Python 3 运行时准备 App Engine 配置文件。 多项重要更改影响了 app.yaml 中的配置设置,这些配置包括但不限于:

    • 现在假定应用的线程安全。如果应用不是线程安全的,则应将 app.yaml 中的 max_concurrent_requests 设置为 1。此设置可能会导致创建的实例数多于线程安全应用所需的数量,并产生不必要的费用。
    • app.yaml 文件不会再将请求路由到您的脚本。因此,您需要使用具有应用内路由的 Web 框架,并更新或移除 app.yaml 中的所有 script 处理程序。 有关如何使用 Flask 框架执行此操作的示例,请参阅 GitHub 中的 App Engine 迁移指南代码示例

      如需详细了解如何更改此配置文件和其他配置文件,请参阅配置文件部分。

  4. 在 Python 3 环境中测试和部署升级后的应用。

    通过所有测试后,将升级后的应用部署到 App Engine,但阻止流量自动路由到新版本。使用流量拆分,将 Python 2 运行时中应用的流量缓慢迁移到 Python 3 运行时中的应用中。如果遇到问题,您可以将所有流量路由到一个稳定的版本,直到问题得到解决。

有关如何将 Python 2 应用转换为 Python 3 的示例,请参阅这些其他资源

Python 2 和 Python 3 运行时的主要区别

在运行时迁移过程中,您需要执行的多数更改都是因为 Python 2 和 Python 3 运行时之间存在的以下区别:

Python 2 和 Python 3 之间的兼容性问题

当 Python 3 在 2008 年首次发布时,该语言引入了数个向后不兼容的更改。其中一些更改只需要对代码进行小幅更新,例如将 print 语句更改为 print() 函数。还有一些更改可能需要大幅更新代码,例如更新处理二进制数据、文本和字符串的方式。

许多流行的开源库,包括 Python 标准库,在从 Python 2 迁移到 Python 3 时也发生了变化。

Python 3 运行时中的 App Engine 捆绑服务

为了减少迁移工作量和复杂性,App Engine 标准环境允许您在 Python 3 运行时中访问许多旧版捆绑服务和 API,例如 Memcache。您的 Python 3 应用可以通过语言惯用库调用捆绑服务 API,并访问与 Python 2 运行时相同的功能。

您还可以选择使用可提供与 App Engine 捆绑服务类似功能的 Google Cloud 产品。我们建议您考虑迁移到非捆绑的 Google Cloud 产品,这样可以充分利用持续的改进和新功能。

对于在 Google Cloud 中未作为单独产品提供的捆绑服务(如图片处理、搜索和消息功能),您可以使用我们推荐的第三方提供商或其他解决方法

配置文件

在 App Engine 标准环境的 Python 3 运行时中运行应用之前,可能需要更改该 App Engine 使用的一些配置文件:

需要 Web 框架才能路由对动态内容的请求

在 Python 2 运行时中,您可以在 app.yaml 文件中创建网址处理程序,在请求特定网址或网址格式时指定运行哪个应用

在 Python 3 运行时中,要路由动态内容请求,您的应用需要使用 Flask 或 Django 等 Web 框架,而不是使用 app.yaml 中的网址处理程序。对于静态内容,您可以继续在您应用的 app.yaml 文件中创建网址处理程序

测试

我们建议您使用与 Python 惯有相关的测试方法,而不是依赖于 dev_appserver。例如,您可以使用 venv 创建一个独立的本地 Python 3 环境。在其中,任何标准的 Python 测试框架都可用于编写单元、集成和系统测试。此外,您还可以考虑设置服务的开发版本,或使用可用于多个 Google Cloud 产品的本地模拟器。

(可选)您可以使用支持 Python 3 的预览版 dev_appserver。如需详细了解此测试功能,请参阅使用本地开发服务器

正在部署

Python 3 不支持通过 appcfg.py 进行部署。请使用 gcloud 命令行工具部署您的应用。

日志记录

Python 3 运行时中的日志记录遵循 Cloud Logging 中的日志记录标准。在 PHP 3 运行时中,应用日志不再与请求日志捆绑,而是分隔在不同的记录中。如需详细了解如何在 Python 3 运行时中读取和写入日志,请参阅日志记录指南

其他迁移资源

如需详细了解如何将 App Engine 应用迁移到独立 Cloud 服务或 Python 3 运行时,请参阅以下 App Engine 资源: