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使用命令.
Y.H*_*ong 70
我是这样做的:
该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部署方法,仍需要将该目录保留在源代码管理下.
我更喜欢扩建.
您可以在项目或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.
(2021 年 6 月)这篇文章已有十多年历史了,因此现在有必要更新答案。
requirements.txt任何所需的版本号;它们将在部署时由 Google 自动安装。(如果您决定将应用迁移到 Google Cloud Functions或Cloud Run ,则使用相同的技术。)requirements.txt按照上面的方法创建lib,通过pip install -t lib -r requirements.txtappengine_config.py所示创建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,所以这就是安装的版本。)
| 归档时间: |
|
| 查看次数: |
20578 次 |
| 最近记录: |