Как управлять сторонними библиотеками Python с помощью Google App Engine? (виртуальное окружение? Пип?)
какова лучшая стратегия управления сторонними библиотеками Python с помощью Google App Engine?
скажем, я хочу использовать 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 ...)
должен быть лучший способ управления сторонним кодом, особенно если я хочу отслеживать версии, тестировать обновления или если две библиотеки совместно используют подкаталог. Я знаю, что Python может импортировать модули из zipfiles и что Пип может работать с замечательным файлом требований, и я видел, что Пип есть zip команда для использования с GAE.
(Примечание: есть несколько подобных вопросов - 1,2,3,4,5 - но они специфичны для конкретного случая и на самом деле не отвечают на мой вопрос.)
6 ответов:
как насчет просто:
$ pip install -r requirements.txt -t <your_app_directory/lib>создать/редактировать
<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'))обновление:
Google обновил свой образец к
appengine_config.py, например:from google.appengine.ext import vendor vendor.add('lib')Примечание: даже если их пример имеет
.gitignoreигнорироватьlib/каталог вам все равно нужно сохранить этот каталог под управлением исходного кода, если вы используетеgit-pushметод развертывания.
вот как я делаю это:
- .Питон
- bin
- lib
- вместо python2.5
- сайт-пакеты
- включить
- src
- приложение.и YAML
.и YAML- главная.и YAML
The
projectкаталог-это каталог верхнего уровня, в котором находится virtualenv. Я получаю virtualenv с помощью следующих команд:cd project virtualenv -p /usr/bin/python2.5 --no-site-packages --distribute .The
srcкаталог, где весь ваш код идет. При развертывании кода в GAE,*только* разверните их в каталоге src и ничего больше. Элементappcfg.pyразрешим ссылки и скопировать библиотеку файлы в Гае для вас.Я не устанавливаю свои библиотеки в виде zip-файлов в основном для удобства, если мне нужно прочитать исходный код, который я часто делаю просто из любопытства. Однако, если вы действительно хотите сжать библиотеки, поместите следующий фрагмент кода в свой main.py
import sys for p in ['librarie.zip', 'package.egg'...]: sys.path.insert(0, p)после этого вы можете импортировать свои застегнутые пакеты, как обычно.
одна вещь, чтобы следить за это setuptools'
pkg_resources.py. Я скопировал это прямо в мойsrcкаталог, чтобы мои другие символические пакеты могли его использовать. Следите за всем, что используетentry_pointы. В моем случае я использую Toscawidgets2 и мне пришлось покопаться в исходном коде, чтобы вручную подключить штук. Это может стать раздражающим, если у вас было много библиотек, которые полагаются наentry_point.
предпочитаю климатическое оборудование.
вы устанавливаете зависимости в setup.py в вашем проекте или сборке.cfg, закрепите версии в сборке.cfg, и укажите, какие пакеты недоступны на GAE и должны быть включены в пакеты.застежка-молния. стержень.рецепт.appengine будет копировать необходимые пакеты в пакеты.zip, и до тех пор, как вы вставляете пакеты.zip в систему.пути, они могут быть импортированы в любом месте.
вы также можете использовать вилки из github, если пакет вам не нужен на pypi
find-links = https://github.com/tesdal/pusher_client_python/tarball/rewrite#egg=pusher-2.0dev2 [versions] pusher = 2.0dev2и все эти настройки и зависимости версируются в git.
вместо того, чтобы задаваться вопросом, какая копия Flask в настоящее время включена в ваше исходное дерево и, возможно, скопирована в Ваш контроль версий (или требует, чтобы новые разработчики вручную распаковывали и обновляли), вы просто проверяете версию в buildout.контекстно-свободная грамматика. Если вы хотите новую версию, измените сборку.cfg и перезапустите оборудование.
вы также можете использовать его для вставки переменных в конфигурационный файл шаблоны, такие как установка идентификатора и версии appspot в приложении.yaml, если у вас есть промежуточный сервер с промежуточным.cfg и так далее.
недавно я создал инструмент для этого под названием gaenv. Он следует требованиям.формат txt, но не устанавливает его, вы можете установить с требованиями pip install-R.затем txt запускает инструмент командной строки gaenv.
$ pip install -r requirements.txt $ gaenvэто создает символические ссылки автоматически, вы можете установить gaenv в вашем virtualenv тоже и запустить двоичный файл оттуда. Вот в блоге об этом:
http://blog.altlimit.com/2013/06/google-app-engine-virtualenv-tool-that.html
также на github
Wernight это!--10--> является самым близким к текущей практике в официальный пример колбы приложение, который я уже улучшил, изменив
sys.path.insert()вызовsite.addsitedir()для обеспечения пространство имен пакетов путем обработки их помощника.pthфайлы (которые важны для таких фреймворков, как пирамида).пока все хорошо, но это добавляет каталог к пути, и поэтому теряет возможность переопределить включенные библиотеки (например, WebOb и запросы) с более новыми версиями.
что нужно тогда в
appengine_config.py(и я пытаюсь получить это изменение принято в официальных РЕПО, а также) является следующее:"""This file is loaded when starting a new application instance.""" import os.path import site.addsitedir import sys.path dirname = 'lib' dirpath = os.path.join(os.path.dirname(__file__), dirname) # split path after 1st element ('.') so local modules are always found first sys.path, remainder = sys.path[:1], sys.path[1:] # add `lib` subdirectory as a site directory, so our `main` module can load # third-party libraries. site.addsitedir(dirpath) # append the rest of the path sys.path.extend(remainder)окончательная версия этого кода может оказаться скрытой в
vendor.pyмодуль и называется вродеinsertsitedir(index, path)или какой-то другой вариант, как вы можете видеть в обсуждении присутствуя на этом запросе тяги, но логика более или менее, как это будет работать независимо от того, чтобы простоpip install -r requirements.txt -t lib/работать для всех пакетов, включая пространства имен, и по-прежнему разрешать переопределение включенных библиотек с новыми версиями, как я до сих пор невозможно найти более простую альтернативу.
Примечание: этот ответ специфичен для колбы на Google App Engine.
см. проект flask-appengine-template для примера того, как заставить расширения Flask работать на App Engine. https://github.com/kamalgill/flask-appengine-template
поместите расширение в папку пакета пространства имен в src / packages / flaskext, и вы все набор. https://github.com/kamalgill/flask-appengine-template/tree/master/src/lib/flaskext
пакеты без колбы могут быть помещены в папку src/packages в виде zip-файлов, яиц или распакованных пакетов, поскольку шаблон проекта включает в себя sys.путь.вставить () фрагмент, опубликованный выше.
Comments