Каковы преимущества pip и virtualenv? - PullRequest
23 голосов
/ 19 декабря 2010

Итак, все говорят мне использовать 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 и установлены в системе.level (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

Работа с non-python-only зависимости :

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

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

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

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

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

Редактировать : я убрал использование -U для пипса, это не нужно для пипса 8.2

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

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

Ответы [ 4 ]

14 голосов
/ 19 декабря 2010

virtualenv действительно сияет, когда у вас есть несколько проектов, и вы не хотите, чтобы все они использовали одну и ту же установку Python.Например, у вас может быть два проекта с противоречивыми требованиями.

7 голосов
/ 19 декабря 2010

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

Тогда вы не можете иметь разные зависимости для разных проектов и разные версии этих зависимостей для разных проектов.

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

А если вы устанавливаете системные инструменты, которыеЕсли вам нужна одна версия, вы вынуждены везде использовать одну и ту же версию, что может нарушить ваши проекты.

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

Я бы определенно рекомендовал иметь отдельный python для ваших проектов и использовать что-то, что изолирует даже этот Python от проектов, напримерvirtualenv или zc.buildout.

PIP - это лишь более простой способ установки модулей, который также помогает вам удалить их.

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

Нет, я использую zc.buildout, но это почти то же самое, но меньше работы.;)

3 голосов
/ 19 декабря 2010

Я следую методу, который вы предложили, без pip / virtualenv для моих обычных проектов. Это позволяет мне помещать пакеты в определенный каталог.

+ext
  |
  |------python packages
+source
  |
  |------ project code and packages

И обычно при запускескрипт, который я обновляю, PYTHONPATH

export PYTHONPATH="";
export PYTHONPATH="${PYTHONPATH}:${workingdir}/path/to/ext";

Это дает преимущество, заключающееся в том, что проект и зависимости остаются автономными.Я повторяю ваши мысли здесь.

Как бы то ни было, я нахожу применение virtualenv, когда

  1. Я должен экспериментировать с something new.
  2. Еще лучше, когда я хочу использовать two different versions of package и сравнить их.
  3. Еще одно применение, где я храню different related packages that can be used across projects.

Пример: Документация : Некоторые ключевые пакеты, которые я установил, включают sphinx, pygraphwiz, nterworkX и некоторые другие пакеты визуализации.Я использую его в разных проектах, а также держу вне установки на системном уровне, чтобы сохранить его незагрязненным.

Я также хотел бы, чтобы вы оформили заказ: Желток. Мне нравится в сочетании с pip / virtualenv.

Вы можете перечислить пакеты

yolk -l
Jinja2          - 2.5.5        - active 
Markdown        - 2.0.3        - active 
Pycco           - 0.1.2        - active 
......

И проверьте обновления Pypi.

yolk --show-updates
Pycco 0.1.2 (0.2.0)
Sphinx 1.0.4 (1.0.5)
pip 0.8.1 (0.8.2)
2 голосов
/ 19 декабря 2010

Развертывание с помощью 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

Что я делаю: Я также "замораживаю" пакетыно я делаю это с pip и virtualenv и проверяю весь проект;в том числе пакеты Python.Так что мое развертывание точно такое же, как у вас:

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

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

Согласно вам:

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

Что я делаю: Добавьте постактивирующий хук вот так:

$ cat bin/postactivate
cd $VIRTUAL_ENV
./manage.py runserver 0:8000
$

А теперь перейдем к проекту:

workon projectfoo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...