Организация питон проекта

anderson |
Давняя проблема всех разработчиков программного обеспечения - установка и развёртывание приложений на разных системах с исключением конфликтов версий. В питоно-индустрии эта проблема частично решена с помощью связки virtualenv и pip, о которых я хочу рассказать в этой статье.

Выясним по порядку, что за программы и с чем их едят.
1. virtualenv - Как видно из названия, это приложение создаёт виртуальное окружение для питон проектов. В народе такую вещь называют модным словом sandbox (песочница). Сразу оговорюсь, окружение бывает полностью или частично изолированным. Сегодня речь пойдёт о частичном изолировании.

2. pip - Пакетный менеджер, очень похожий на наверняка знакомую вам программу easy_install, с одним серьёзным отличием: pip умеет устанавливать пакеты определённых ревизий прямо из репозитория используя git, mercurial, bazaar, subversion и ещё некоторые системы контроля версий.

Конкретные проблемы, которые решает эта связка:
а. Права доступа на установку программ
б. Конфликты версий
в. Автоматическая установка зависимостей.


Несмотря на то что есть и альтернативные методы решить вышеперечисленные проблемы, данные программы поражают своей простотой использования.

Давайте рассмотрим на примерах использование этих инструментов при разработке реальных проектов. Например, на django проекте.

Создаём в папке нашего проекта виртуальное окружение с помощью команды virtualenv "venv". venv в данном случае путь до директории, в которой будут хранится файлы виртуального окружения. Следующим шагом является установка pip во внутрь свежеиспечённого окружения. Для этого, сначала активируем песочницу source venv/bin/activate и запустим easy_install, который автоматически устанавливается в виртуальное окружение. easy_install pip

Стоит отметить, что с недавних пор питон сообщество решило переписать пакет setuptools, из которого и появляется в системе команда easy_install. Назавли этот форк distribute, поэтому если вы хотите, чтобы ваше окружение использовало именно disitribute, при создании не забудьте передать опцию --distribute.

Теперь дело за малым - составить список зависимостей вашего проекта. Вот например список зависимостей сайта pyplanet.org

dateutils
pytz
python-openid==2.2.4
oauth==1.0.1
feedparser==4.1
akismet==0.2
-e svn+http://pyfacebook.googlecode.com/svn/trunk/#egg=pyfacebook
-e svn+http://code.djangoproject.com/svn/django/trunk@13290#egg=django
-e svn+http://django-compress.googlecode.com/svn/trunk@98#egg=django_compress
-e svn+http://django-voting.googlecode.com/svn/trunk/@73#egg=django_voting
-e svn+http://django-mptt.googlecode.com/svn/trunk/@121#egg=django_mptt
-e hg+http://bitbucket.org/offline/django-annoying/@24#egg=django_annoying
-e hg+http://bitbucket.org/offline/django-confirmation/@8#egg=django_confirmation
-e hg+http://bitbucket.org/offline/django-publicauth/@76#egg=django_publicauth
-e hg+http://bitbucket.org/offline/django-simplepagination/@5#egg=django_simplepagination
-e hg+http://bitbucket.org/offline/django-tagging2/@20#egg=django_tagging2
-e hg+http://bitbucket.org/offline/django-bbmarkup/@12#egg=django_bbmarkup
-e hg+http://bitbucket.org/offline/django-tsearch2/@6#egg=django_tsearch2
-e hg+http://bitbucket.org/andrewgodwin/south/@700#egg=django_south
-e hg+http://bitbucket.org/lorien/sape/@16#egg=sape
-e git+git://github.com/alex/django-filter.git@bdb1015f34#egg=django_filter
-e git+git://github.com/clintecker/django-google-analytics.git@d28bca4de2#egg=google_analytics
-e git+git://github.com/j2a/pytils.git@4316927ff5d3f#egg=pytils

Как вы видите, записи немного различаются. Строчки, которые не начинаются с "- e", устанавливаются с сайта pypi.python.org. Если у пакета не указана версия, то устанавливается последняя.

В случае с остальными записями, они выкачиваются из репозиториев и могут тянуть пакет определённой ревизии, она указывается после знака "@". Также нужно указать папку в которую будет складываться файлы пакета. Это название не имеет большого значения на конечный результат, но указывается в обязательном порядке после #egg=

Ещё одна вещь которую хочется отметить. Если вы хотите установить пакет из git репозитория, у вас в системе должен быть установлен git.

После того как вы создали список зависимостей и сохранили его в файле, запускайте команду pip install -r path_to_file.txt

После всех этих манипуляций ваш проект должен быть собран и изолирован от других. Установка пакетов других версий в других проектах на этой же системе никак не повлияет на вас.
Теги: Share
Комментарии (5)
zzz #
Про pip сказано достаточно для новичка, а вот про virtualenv маловато.
Я бы добавил такой пример:



Кстати, очень не рекомендую создавать виртуальное окружение с помощью pip -- использовать virtualenv.
0
zzz #
Блин! Где редактирование написанного, чтобы исправить ошибки? И где предпросмотр?
1
anderson #
Пока нет такой опции. Если хотите то напишите новый комментарий, а старый я сотру.
0
anderson #
дело в том, что после активации окружения, pip install -r virtualenv.req будет полностью эквивалентным вашему примеру.
0
zzz #
Хм... Вы правы. Я не заметил про активацию. Просто сам никогда её не использую её.
0
toshka #
Установка дополнительных модулей и окружения - это еще пол беды, дальше начинается не менее интересные приключения - запуск самого приложения и настройка веб сервера. Возможно, проекты на Django попроще запустить, но вот Pylons проект заставит попрыгать с бубном :)
0
can3p #
Согласен с предыдузим оратором. Запустить pylons под mod_wsgi для новичка - не такая простая задача. Меня, например, на каком-то этапе поставило в тупик отстутствие логов, которые вроде как были включены в настройках приложения, и хотя обойти это можно, в официальной документации об этом ни слова
0
alexanderich #
Честно говоря, абсолютно не понятно как работают virtualenv и pip.