Как управлять сторонними библиотеками 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 - но они специфичны для конкретного случая и на самом деле не отвечают на мой вопрос.)

636   6  

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

https://github.com/faisalraja/gaenv

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

    Ничего не найдено.