如何使用Google App Engine管理第三方Python库?(virtualenv?pip?)

a p*_*erd 62 python deployment google-app-engine egg pip

使用Google App Engine管理第三方Python库的最佳策略是什么?

说我想使用Flask,一个webapp框架.博客条目说这样做,这似乎不对:

$ cd /tmp/
$ wget http://pypi.python.org/packages/source/F/Flask/Flask-0.6.1.tar.gz
$ tar zxf Flask-0.6.1.tar.gz
$ cp -r Flask-0.6.1/flask ~/path/to/project/
(... repeat for other packages ...)
Run Code Online (Sandbox Code Playgroud)

必须有更好的方法来管理第三方代码,特别是如果我想跟踪版本,测试升级或两个库共享一个子目录.我知道,Python可以从zipfiles导入模块和PIP可以用美妙的需求文件工作,我已经看到了PIP具有zip与GAE使用命令.

(注:有类似的问题了一把- 1,2,3,4,5 -但他们的情况下,具体的,真的不回答我的问题.)

Y.H*_*ong 70

我是这样做的:

  • 项目
    • .蟒蛇
    • 箱子
    • LIB
      • 的python2.5
        • 站点包
          • <pip install packages>
    • 包括
    • SRC
      • 的app.yaml
      • index.yaml中
      • main.yaml
      • <符号链接在./lib/python2.5/site-packages中的pip安装包

project目录是virtualenv所在的顶级目录.我使用以下命令获得virtualenv:

cd project
virtualenv -p /usr/bin/python2.5 --no-site-packages --distribute .
Run Code Online (Sandbox Code Playgroud)

src目录是您的所有代码所在的目录.当您将代码部署到GAE时,**在src目录中部署它们而不是其他任何内容.在appcfg.py将解决符号链接和复制库文件到GAE你.

我不会将我的库安装为zip文件,主要是为了方便我需要阅读源代码,出于好奇,我碰巧做了很多.但是,如果您确实要压缩库,请将以下代码段放入main.py中

import sys
for p in ['librarie.zip', 'package.egg'...]:
    sys.path.insert(0, p)
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以像往常一样导入拉链包.

需要注意的一点是setuptools' pkg_resources.py.我将其直接复制到我的src目录中,以便我的其他符号链接包可以使用它.注意任何使用entry_points的东西.在我的情况下,我使用Toscawidgets2,我不得不深入挖掘源代码,手动连接件.如果你有很多依赖的库,它会变得很烦人entry_point.


Wer*_*ght 46

简单来说:

$ pip install -r requirements.txt -t <your_app_directory/lib>
Run Code Online (Sandbox Code Playgroud)

创建/编辑<your_app_directory>/appengine_config.py:

"""This file is loaded when starting a new application instance."""
import sys
import os.path

# add `lib` subdirectory to `sys.path`, so our `main` module can load
# third-party libraries.
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'lib'))
Run Code Online (Sandbox Code Playgroud)

更新:

谷歌将他们的样本更新为appengine_config.py:

    from google.appengine.ext import vendor
    vendor.add('lib')
Run Code Online (Sandbox Code Playgroud)

注意:即使他们的示例.gitignore忽略了lib/目录,如果使用git-push部署方法,仍需要将该目录保留在源代码管理下.

  • 这应该是答案,因为它已经被谷歌"批准"了 (5认同)
  • 更新后的答案是官方的Google App Engine方法:https://cloud.google.com/appengine/docs/python/tools/libraries27(请注意,您无需下载vendor.py,只需添加来自google.appengine的` .ext将vendor`导入您的appengine_config.py (2认同)

tes*_*dal 6

我更喜欢扩建.

您可以在项目或buildout.cfg中的setup.py中设置依赖项,在buildout.cfg中设置版本,并指定哪些包在GAE上不可用,并且应包含在packages.zip中.rod.recipe.appengine会将所需的包复制到packages.zip中,只要将packages.zip插入到sys.path中,就可以将它们导入到任何地方.

如果您需要的包不在pypi上,您也可以使用github中的分叉

find-links =
    https://github.com/tesdal/pusher_client_python/tarball/rewrite#egg=pusher-2.0dev2

[versions]
pusher = 2.0dev2
Run Code Online (Sandbox Code Playgroud)

并且所有这些设置和依赖项都在git中进行了版本控制.

您可以只检查buildout.cfg中的版本,而不是想知道哪个Flask副本当前包含在您的源代码树中并且可能被复制到您的版本控制中(或者需要新开发人员手动解压缩和升级).如果需要新版本,请更改buildout.cfg并重新运行buildout.

您还可以使用它将变量插入到配置文件模板中,例如,如果您有staging服务器和staging.cfg等,则在app.yaml中设置appspot id和version.


wes*_*cpy 2

(2021 年 6 月)这篇文章已有十多年历史了,因此现在有必要更新答案。

  1. Python 3:列出 3P 库以及requirements.txt任何所需的版本号;它们将在部署时由 Google 自动安装。(如果您决定将应用迁移到 Google Cloud FunctionsCloud Run ,则使用相同的技术。)
  2. 不带 内置 3P 库的Python 2(常规 3P 库):
  • requirements.txt按照上面的方法创建
  • 在本地安装/自我捆绑/复制它们,例如lib,通过pip install -t lib -r requirements.txt
  • 按照本页步骤 5appengine_config.py所示创建
  1. 具有 内置 3P 库的Python 2(特殊的 3P 库集):
  • 上面链接的所有列出的 3P 库都是“内置的”,这意味着它们可以在 App Engine 服务器上使用,因此您不必将它们复制/自我捆绑到您的应用程序中(如上面的#2 所示)
  • libraries:只需在您的部分中列出它们的可用版本即可,app.yaml 如下所示
  • (不要放入内置库,requirements.txt也不要pip install在本地安装它们,除非您想自行捆绑,因为,比如您需要更新版本的内置库。)
  • appengine_config.py像上面一样创建。

如果您有一个同时包含内置非内置 3P 库的 Python 2 应用程序,请使用上面 #2 和 #3 中的技术(内置库app.yaml和非内置库)requirements.txt并运行pip installcmd多于)。第二代运行时(如 Python 3)的改进之一是所有这些带有 3P 库的游戏都会神奇地消失(参见上面的#1)。

示例:烧瓶

Flask 是一个第三方微型 Web 框架,对于这个特定问题来说,这是一个有趣的案例。对于 Python 3,它们都进入requirements.txt,因此您只需添加flask到该文件中即可。(只需从那里部署即可。)

对于Python 2,它有趣,因为它是一个内置库。不幸的是,App Engine 服务器上的版本是0.12. 当我们处于/超越现在时谁想使用2.0.3?!?因此,您不必像其他内置库一样将其放入app.yaml,而是假装内置版本不存在并将其放入,requirements.txt然后运行pip2 install -t lib -r requirements.txt以将其与应用程序代码捆绑/供应商。(但是,Python 2 的最终版本是1.1.4,所以这就是安装的版本。)