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

使用 Python 2 库

如果第三方库是不包含 C 扩展程序的纯 Python 代码,则只需将该库复制到您的应用目录,便可以开始使用。如果已内置第三方库并与运行时捆绑,那么您无需将其复制到自己的应用,便可以使用该库。

第三方库必须作为不包含 C 扩展程序的纯 Python 代码实施。如果将这些库复制到应用目录,它们将计入文件配额,因为该库会与您的应用代码一同上传到 App Engine。

复制第三方库

要使用与运行时捆绑的内置库列表中未列出的第三方库,请执行以下操作:

  1. 创建一个用于存储第三方库的目录,如 lib/

    mkdir lib
    
  2. 使用带有 -t <directory> 标志的 pip(版本 6 或更高版本)将库复制到您在上一步中创建的文件夹。例如:

    pip install -t lib/ <library_name>
    

    要在 macOS 上使用 Homebrew Python?

  3. 在与 app.yaml 文件相同的文件夹中创建一个名为 appengine_config.py 的文件。

  4. 编辑 appengine_config.py 文件,并向 vendor.add() 方法提供库目录。

    # appengine_config.py
    from google.appengine.ext import vendor
    
    # Add any libraries install in the "lib" folder.
    vendor.add('lib')
    

    上方的 appengine_config.py 文件假设当前工作目录是 lib 文件夹所在的位置。在某些情况下,比如单元测试,当前工作目录可能有所不同。为避免出错,您可以使用以下命令,将完整路径明确传递到 lib 文件夹:

    vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))
    

结合使用 pip 需求文件与复制的库

pip 可读取要从文件(称为需求文件)中安装的库列表。借助需求文件,您可以轻松为应用设置新的开发环境,并升级到新的库版本。

需求文件是一个文本文件,其中每行对应一个库,列出了软件包名称,有时还会列出软件包的版本(默认为最新版本):

Flask==0.10
Markdown==2.5.2
google-api-python-client

如需安装需求文件中的库,请使用 -r 标志以及 -t lib 标志:

pip install -t lib -r requirements.txt

使用与运行时捆绑的内置第三方库

如果第三方库列在与 App Engine Python 运行时捆绑的内置库列表中,则您只需在 app.yaml 中的 libraries 指令下指定该库即可,例如:

libraries:
- name: PIL
  version: "1.1.7"
- name: webob
  version: "1.1.1"

在部署过程中,App Engine 会自动提供请求的库。

结合使用内置捆绑库与本地开发服务器

运行时环境提供的许多内置库自动可供本地开发服务器使用。如需在本地安装一些库,您必须运行 gcloud components install app-engine-python-extras。如果本地开发服务器检测到需要此组件,则会提示您安装它。必须先在本地安装以下内置库,然后才能将它们与本地开发服务器一起使用:

您可以使用 pip 命令,从 Python 软件包索引 (PyPI) 安装所有这些软件包。

sudo pip install lxml==2.3.5

根据平台的不同,您可能需要安装构建支持工具和 Python 源,然后才能安装这些库。

  • 在 Linux 上,软件包管理器可以提供这些前提条件,并且通常可以提供库的预构建版本。
  • 在 Windows 上,通常有预构建版本的安装程序可用。
  • 在 macOS 上,部分软件包的构建需要 Xcode 命令行工具。

无论 app.yaml 中指定哪个版本,开发服务器都会使用您在本地安装的软件包版本。如果需要,请为您的项目设置 virtualenv,以提供确切的软件包版本。请注意,virtualenv 仅在本地用于二进制软件包,并且部署后,您的应用将无法使用。要添加其他第三方库,请使用安装库中介绍的方法。

在本地开发服务器中使用 Django

Django 是适用于 Python 的功能全面的 Web 应用框架。该框架提供一套完整的可互换组件,包括分派、视图、中间件和模板组件等。

Django 数据建模接口与 App Engine 数据存储区不兼容。您可以在 Django 应用中使用 App Engine 数据建模库(dbndb)。 但是,使用 Django 数据建模接口的第三方 Django 应用(其中最值得关注的是 Django 的管理员应用)可能无法直接与 App Engine 结合使用。

默认使用数据存储区建模库 (DB)。如需将 Django 与 NDB storage API 结合使用,请将 'google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware', 添加到 Django settings.py 文件中的 MIDDLEWARE_CLASSES 条目。最好将其插入到任何其他中间件类之前,因为某些其他中间件可能会进行数据存储区调用,而如果该中间件在此中间件之前调用,那么将无法正确处理那些中间件。 如需详细了解 Django 中间件,请参阅项目文档

如需在应用中启用 Django,请在 app.yaml 中指定 WSGI 应用和 Django 库:

...
handlers:
- url: /.*
  script: main.app  # a WSGI application in the main module's global scope

libraries:
- name: django
  version: "1.4"

在导入软件包之前,必须将 DJANGO_SETTINGS_MODULE 环境变量设置为 Django 设置模块的名称(通常为 'settings')。

如果 Django 设置模块不是 settings.py,请在 app.yaml 文件中相应地设置 DJANGO_SETTINGS_MODULE 环境变量:

env_variables:
  DJANGO_SETTINGS_MODULE: 'myapp.settings'

或者在 Python 代码中:

import os
# specify the name of your settings module
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

import django.core.handlers.wsgi
app = django.core.handlers.wsgi.WSGIHandler()

在本地开发服务器中使用 matplotlib

Matplotlib 是绘图库,可生成各种图片格式的图表和图形。App Engine 不支持 matplotlib 的交互模式,还有其他一些功能也不可用。这意味着,正如许多 matplotlib 教程所述,您不能使用 pyplot.show()。相反,您应该使用 pyplot.savefig() 将图片数据写入到输出流、cStringIO.StringIO 实例或使用 Cloud Storage 客户端库的Google Cloud Storage。

Matplotlib 允许使用 matplotlibrc 配置文件进行广泛自定义,该配置文件应该位于应用的顶级目录中。或者,您可以将 MATPLOTLIBRC 环境变量设为与应用目录相对应的路径。

默认后端为 AGG,允许写入所有支持格式的文件:PNG(默认格式)、RAW、PS、PDF、SVG 和 SVGZ。如果您通过将 PIL 添加到 app.yamllibraries 部分来提供 PIL 库,则 AGG 后端也将自动支持写入 JPEG 和 TIFF 图片格式。

Matplotlib 附带许多自动提供的字体。您也可以使用自定义字体,方法是将 TTF 格式的自定义字体随您的应用一同上传,并将 TTFPATH 环境变量设为字体所在的路径(相对于您应用的路径)。如需了解详情,请参阅 app.yaml 参考文档。

App Engine 不支持许多 matplotlib 功能。特别是:

  • 没有 ~/.matplotlib 目录。但是,如上所述,您可将 matplotlibrc 配置文件放在备用位置。
  • 不支持交互式后端和 GUI 元素。
  • 不支持 EMF、Cairo 和 GDK 后端。
  • 没有缓存,因此许多机制都要重新计算或重新下载通常会缓存的数据。已停用的具体缓存机制包括通过 matplotlib.font_manager.FontManager.findfont 计算的字体数据、matplotlib.cbook.get_sample_data 下载的示例数据和 matplotlib.finance.fetch_historical_yahoo 下载的财务数据。
    • 由于没有缓存,因此除非将 examples.download 设为 False,否则无法用 asfileobj=False 调用 [matplotlib.cbook.get_sample_data](http://matplotlib.org/api/cbook_api.html#matplotlib.cbook.get_sample_data)
  • 调用外部命令的所有功能均已停用。
  • matplotlib.test 函数已停用。

后续步骤