Подтвердить что ты не робот

Каковы преимущества 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, обновляю symlink в lib и commit. Теперь все остальные, работающие над проектом, получат обновление на их следующий svn up или git pull. Одно нехорошо, так это то, что старый папка в src останется, если в ней содержится некоторый файл pyc, это может легко избегайте удаления всех pyc перед обновлением локальной копии.

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

Вы передаете новую версию файла требований, надеюсь, что все, кто работает над проект замечает новую версию, когда обновляет свою локальную копию, а затем выполните 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 будет лучше, чем то, что я делаю?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

И обычно в старте script я обновляю PYTHONPATH

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

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

Как бы то ни было, я нахожу использование virtualenv, когда

  • Мне нужно поэкспериментировать с something new.
  • Еще лучше, когда я хочу использовать two different versions of package и сравнить их.
  • Другое использование - это где я держу 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)

Ответ 4

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

Что я делаю: Добавьте postactivate hook следующим образом:

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

И теперь, чтобы перейти к проекту:

workon projectfoo