如果第三方库是不包含 C 扩展程序的纯 Python 代码,则只需将该库复制到您的应用目录,便可以开始使用。如果已内置第三方库并与运行时捆绑,那么您无需将其复制到自己的应用,便可以使用该库。
第三方库必须作为不包含 C 扩展程序的纯 Python 代码实施。如果将这些库复制到应用目录,它们将计入文件配额,因为该库会与您的应用代码一同上传到 App Engine。
复制第三方库
要使用与运行时捆绑的内置库列表中未列出的第三方库,请执行以下操作:
创建一个用于存储第三方库的目录,如
lib/
。mkdir lib
使用带有
-t <directory>
标志的 pip(版本 6 或更高版本)将库复制到您在上一步中创建的文件夹。例如:pip install -t lib/ <library_name>
Homebrew 问题
如果您在 macOS 上使用 Homebrew Python,则运行
pip install -t
时可能会遇到异常。此问题与已知的 Homebrew 安装问题(请参阅Note on pip install --user
)以及 Homebrew 的 Python 配置有关。如需解决此问题,请使用以下命令在主目录中临时创建一个~/.pydistutils.cfg
文件:[install] prefix=
为 App Engine 应用安装了软件包后,请务必删除该文件,因为该文件会阻止您在此上下文以外安装软件包。
在与
app.yaml
文件相同的文件夹中创建一个名为appengine_config.py
的文件。编辑
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 的功能全面的网络应用框架。该框架提供了全套可互换组件,包括调度、视图、中间件和模板组件等。
Django 数据建模接口与 App Engine 数据存储区不兼容。您可以在 Django 应用中使用 App Engine 数据建模库(db 或 ndb)。 但是,使用 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
环境变量设为与应用目录相对应的路径。
默认backend为 AGG,可写入所有支持格式的文件:PNG(默认格式)、RAW、PS、PDF、SVG 和 SVGZ。如果您通过将 PIL
添加到 app.yaml
的 libraries
部分来提供 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)
。
- 由于没有缓存,因此除非将
- 调用外部命令的所有功能均已停用。
- 已停用
fontconfig
。通过上方描述的机制可找到字体。 - 不支持使用 LaTeX 进行文本渲染。将
text.usetex
设置为True
不起作用。 - 不支持使用外部 PostScript distiller 程序。将
ps.usedistiller
设置为ghostscript
或xpdf
不起作用。 - 不支持使用外部视频编码程序。
matplotlib.animation.Animation.save
方法无效,因此matplotlib.animation
软件包没有用。 - 不支持
matplotlib.cbook.report_memory
函数和matplotlib.cbook.MemoryMonitor
类。
- 已停用
matplotlib.test
函数已停用。
后续步骤
- 详细了解 App Engine Python 运行时环境。
- 查看内置第三方库参考。