Деплоймент python проекта: pip & virtualenv

При работе над 3task мы разработали удобный способ установки зависимостей для проекта. Америку я не открою, просто расскажу, что мы сделали. Надеюсь, кому-нибудь пригодится.

Зависимости обрабатываются с помощью двух инструментов: pip и virtualenv.

Virtualenv позволяет создать собственное окружение проекта, в которое можно установить любые библиотеки любых версий и они никак не будут влиять на другие проекты. Это достаточно удобно. К примеру, можно обновлять джангу и не бояться, что другие проекты попадают, как это могло бы случиться в системе, где несколько проектов используют глобально установленную django.

Pip — это инструмент для установки python-приложений. Грууубо говоря, это аналог easy_install, отличающийся рядом вкусных плюшек. Одна из убойных его фишек — возможность ставить софт прямо из репозитория. Я пробовал ставить из git, svn, hg — всё работает. Возможно, easy_install умеет что-то подобное, я не в курсе, честно говоря. Другие отличительные черты pip: поддержка virtualenv и возможность ставить софт по заранее составленному списку.

Эти два инструмента образуют удобную связку, которая позволяет вызовом одной команды настроить окружение для проекта. Выглядеть это может, например, так.

Файлик build/buildenv.sh руководит всем процессом:

#!/bin/sh
echo Creating environment
virtualenv .env

echo Install PIP inside virtual environment
./.env/bin/easy_install pip

echo Installing dependencies
./.env/bin/pip install -E .env -r ./build/pipreq.txt

То есть сначала создаём виртуальное окружение с помощью инструмента virtualenv. Далее устанавливаем pip через easy_install. Можно, конечно и средствами пакетного менеджера вашей ОС, но easy_install стоит почти везде, так что грех этим не воспользоваться. Третий шаг — установка необходимых библиотек в виртуальное окружение по списку.

Приведу пример файла зависимостей:

-e svn+http://code.djangoproject.com/svn/django/trunk@10748#egg=django
-e svn+http://django-filebrowser.googlecode.com/svn/trunk@358#egg=django-filebrowser
-e svn+http://sorl-thumbnail.googlecode.com/svn/trunk@449#egg=solr
-e svn+http://django-tagging.googlecode.com/svn/trunk@156#egg=django-tagging

-e hg+http://bitbucket.org/lorien/django-account#egg=django-account
-e hg+http://hg.barbuza.info/supercaptcha/#egg=supercaptcha
-e hg+http://bitbucket.org/lorien/pybb#egg=pybb

django-renderform
simplejson
markdown
beautifulsoup
http://django-tinymce.googlecode.com/files/django-tinymce-1.5.tar.gz

Как видите, источники можно указывать самые разные: адреса hg/git/svn репозиториев, адреса архивов, просто имена (поиск идёт через pypi.python.org). Единственное условие: пакет по указанному адресу должен обязательно содержать файл setup.py.

Если специально не запрещать, то пакет ищется сначала в виртуальном окружении, в случае неудачи — в глобальном окружении. Это мне помогло в случае PIL. Почему-то не хотел он компиляться при установке через pip — я поставил его через apt. Драйвера баз данных типа mysqdb мне тоже кажется удобным ставить отдельно — в глобальную область видимости.

Можно почитать по теме:

Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

Pingbacks

13.10.2009 20:40 Debian. Django. Shared hosting. Global vs User/Local Deployment. @softwaremaniacs.org
Я так делаю сейчас: http://web-brains.com/2009/07/19/deplojment-python-proekta-pip-virtualenv/

Comments

А сам проект нужно закидывать в директорию, созданню vurtualenv или достаточно производить запуск как ./env/bin/python /path/to/my/project/manage.py ?

У меня обычно вирт. окружение внутри проекта лежит, просто я в .hgignore (я mercurial юзаю) прописываю эту директорию. Вот. А далее есть два способа: 1-й способ — я им пользуюсь. Просто изменяем manage.py и пишем в первой строчке:

#!.env/bin/python

2-й способ — вроде б так, не пробовал :)

source .env/bin/activate
python manage.py

А вот ещё как я настраивал WSGI-скрипт для запуска в виртуальном окружении:

    # -*- mode: python -*- 

    import sys 
    import os 
    import os.path 
    import site 

    site.addsitedir(os.path.join(os.path.dirname(__file__), 
                                 '.env', 'lib', 'python2.5', 'site-packages')) 

    if not os.path.dirname(__file__) in sys.path[:1]: 
        sys.path.insert(0, os.path.dirname(__file__)) 
    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

    from django.core.handlers.wsgi import WSGIHandler 
    application = WSGIHandler()

http://code.google.com/p/modwsgi/wiki/VirtualEnvironments

эт для WSGI

Ммм, как будто ты вчерашнее сообщение моё прочитал :) Кстати, чтот самого деплоймента тут маловато, или само приложение тоже через pip ставится?

Прочитал, ага. И подумал, надо тож чего-нить написать :D Давно уже хотел.

У меня пока вот такой нехитрый деплоймент. Сам проект я клонирую по ssh и потом ручками на сервере запускаю build.sh :-) Всякие fabric и buildout пощупать хочется — пока руки не дошли.

А куда там build.sh? У нас же python, не C?

Я не понимаю вопроса.

Что делает build.sh? Python ведь не компилируемый?

buildenv.sh, а не build.sh — в статье показано содержимое этого файла, читай внимательнее :-)

А, ты про мой комментарий? Там опечатко, имелся в виду, конечно же, buildenv.sh

tilarids 19.07.2009 20:18

И чем это лучше buildout? Кроме, естественно, монструозности buildout? Насколько я вижу, у buildout возможностей намного больше, можно делать отличные вещи.

Отлично :-)

fabric+pip приятнее :)

That is possible to purchase the school essays, if choose a professional <a href=”http://www.qualityessay.com”>papers service</a>. Just because the professionals only can perform a masterpiece.

You are obviously, a professional but when you want to choose the essay papers, I would propose you to determine the greates one.

As a rule, university students require some assistance completing their term papers. So I would recommend to buy essays, which seems to be a right way to A+ grades.

Thanks for this great site and wonderful article. Kathy from <a href=”http://www.realtungsten.com/”>tungsten rings</a>

[url=http://www.naseya.com/games/cooking/]cooking games[/url]

Thank you so much.

All u need to know about <a href=”http://phlebotomyclinic.com/”>phlebotomy certification</a> <a href=”http://phlebotomyclinic.com/”>phlebotomy training</a>

great website keep up the good work.

hey long time i’ll reach still

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image