Python 2 不再受社区支持。我们建议您将 Python 2 应用迁移到 Python 3

迁移到 Python 3 标准运行时

从 2020 年 1 月 1 日起,Python 社区将不再为 Python 2.7 提供更新服务、修复错误或修补安全问题。我们建议您尽快将仍在 App Engine 标准环境的 Python 2 运行时中运行的应用迁移到 Python 3 运行时。如需了解详情,请参阅 Google Cloud 上的 Python 2 支持

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 服务

从 Python 3 运行时开始,App Engine 标准环境不再包含捆绑式 App Engine 服务,例如 Memcache 和任务队列。相反,Google Cloud 提供了独立的产品,其作用相当于 Python 2 运行时中的大多数捆绑服务。对于在 Google Cloud 中未作为单独产品提供的捆绑式服务(例如图片处理、搜索和消息传递),您可以按照“迁移指南”中的建议使用第三方提供商或其他解决方法。

移除捆绑的 App Engine 服务可使 Python 3 运行时支持完全惯用的Python开发体验。在 Python 3 运行时中,您将编写一个完全可移植并可以在任何标准 Python 环境(包括 App Engine)中运行的标准 Python 应用。

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

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

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

迁移过程概览

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

  1. 将 Python 2 应用中的 App Engine 捆绑服务迁移到 Google Cloud 服务、第三方服务或其他推荐的替代服务。在迁移每项服务后测试您的应用。

    完成此步骤后,您的 Python 2 应用应该不再使用任何 google.appengine API。

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

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

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

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

    • 现在假定应用的线程安全。如果您的应用不是线程安全的,则需要在 app.yaml 文件中进行一些更改,以避免大幅增加费用的可能性。
    • app.yaml 文件不会再将请求路由到您的脚本。相反,您需要使用具有应用内路由的 Web 框架,并更新或移除 app.yaml 中的所有 script 处理程序。
  4. 在 Python 3 环境中测试和部署升级后的应用。

    您可能需要花费大量时间来解决在 Python 3 环境中运行升级后的应用之前观察不到的兼容性问题。

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