Каковы преимущества pip и virtualenv?

Итак, все говорят мне использовать pip и virtualenv, но никто не может объясните мне, чем это лучше, чем мой нынешний подход. Главная причина для людей, использующих pip и virtualenv, похоже, что все остальные используют его ...

Я уверен, что есть очень веские причины использовать PIP и virtualenv, но я не смог найти их с помощью Google. Я надеюсь, что кто-то из Сообщество stackoverflow сможет объяснить мне их.

Вот как я в настоящее время организовываю свои проекты Django:

site/src/ : contains all python-only dependencies of my project

site/lib/ : contains symlinks to the python packages

site/[projectname]/ : contains all my project specific code

Вся папка сайта проверяется в моем репозитории (да, включая все зависимости только для python, такие как сам django) .

Все зависимости, не относящиеся только к Python (PIL, psycopg2, ...), задокументированы в README и установлены на системном уровне (apt-get install ....)

Например, допустим, я иметь название проекта "projectfoo", которое зависит от django-1.2.3, pygeoip-0.1.3 и psycopg2 У меня будет:

/usr/lib/python2.5/site-packages/psycopg2

~/projects/foo/site : checkout of my repository
~/projects/foo/site/src/django-1.2.3
~/projects/foo/site/src/pygeoip-0.1.3
~/projects/foo/site/lib/django -> symlink to ../src/django-1.2.3/django
~/projects/foo/site/lib/pygeoip -> symlink to ../src/pygeoip-0.1.3/pygeoip
~/projects/foo/site/projectfoo/

Как это соотносится с PIP / virtualenv на практике?

Развертывание проекта с моим текущим подходом :

svn checkout https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/site

Развертывание с PIP / virtualenv :

wget https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/projectfoo-requirements.txt
pip install -U -E projectfoo-venv -r projectfoo-requirements.txt

Работа над проектом с моим текущим подходом :

cd ~/projects/foo/site/projectfoo
export PYTHONPATH=.:..:../lib
./manage.py runserver 0:8000

Работа над проектом с PIP / virtualenv :

workon projectfoo
cd path/to/project
./manage.py runserver 0:8000

Работа с зависимостями, не связанными только с Python :

зависимости, не относящиеся только к Python, будут обрабатываться таким же образом, я не могу собираюсь использовать опцию - no-site-packages virtualenv и установить компилятор и все зависимости сборки на моих серверах, я не думаю, что кто-то на самом деле все равно делаю это.

Обновление зависимости только для python с моим текущим подходом :

Я проверяю / распаковываю новую версию в src, удаляю старую из src, обновляю символическая ссылка в библиотеке и фиксации. Теперь все, кто работает над проектом, получат обновления по адресу их следующий svn up или git pull . Некрасиво то, что старые папка в src останется, если она содержит какой-то файл pyc, это может легко можно избежать, удалив все pyc перед обновлением вашей локальной копии.

Обновление зависимости только для Python с помощью PIP / virtualenv :

Вы фиксируете новую версию файла требований, надеюсь, все, кто работает над project замечает новую версию, когда обновляет свою локальную копию, а затем запустите pip install -E projectfoo-venv -r requirements.txt .

Правка : я удаляю использование -U с помощью pip, это не требуется с pip 8.2

Изменить : Единственное преимущество pip / virtualenv над моим текущим подходом, кажется, когда вы работаете в разных проектах, требующих разных версий Python. Но по моему опыту, когда вам нужны разные версии python, вы также нужны разные версии других системных библиотек (PIL, psycopg2, ...) и virtualenv в этом не помогает (кроме тех случаев, когда вы достаточно сумасшедшие, чтобы используйте параметр --no-site-package, и даже в этом случае он неполный). В единственное решение, которое я могу придумать в этой ситуации, - использовать разные виртуальные машины.

Так что же мне не хватает? Может ли кто-нибудь указать мне на случай использования, когда PIP или virtualenv было бы лучше, чем то, что я делаю?

23
задан djoume 20 December 2010 в 15:25
поделиться