Памятка по virtualenv и изолированным проектам на Python

Какую проблему решает virtualenv? По умолчанию pip устанавливает пакеты как бы глобально. Большую часть времени это работает нормально, особенно если пишите вы небольшие скрипты, не имеющие огромного количества зависимостей. Но если у вас в несколько больших проектов, в которых используется что-то тяжелое и ломающее обратную совместимость между релизами (мне пока что удавалось избегать подобных проблем, но не удивлюсь, если этим грешит, скажем, Django) такое поведение становится проблемой.

Так вот, virtualenv — это инструмент, позволяющий создавать виртуальные окружения с пакетами. Разные «песочницы» имеют разный набор пакетов разных версий. Работая над конкретным проектом, вы просто переключаетесь на подходящую песочницу, и проблема уходит. Заметьте, что в отличие от того, как это сделано в некоторых других языках программирования, одну и ту же песочницу можно смело использовать сразу в нескольких проектах. Плюс к этому уходит проблема засорения системы ненужными пакетами, так как песочницы можно легко создавать и удалять. Как я это вижу, программируя на Python в третьем тысячелетии, вообще все нужно делать через virtualenv!

Установка virtualenv и virtualenvwrapper, предоставляющего чуть более удобный интерфейс к virtualenv:

В ~/.bashrc дописываем:

Создаем новое окружение:

Смотрим список окружений:

Меняем окружение:

Выходим из окружения:

Удаляем окружение:

Находясь в одном из окружений, можно ставить пакеты через pip, как обычно:

Список зависимостей проекта, насколько я смог разобраться, принято сохранять в файл с именем requirements.txt:

Этот подход позволяет одной командой установить все зависимости, необходимые проекту:

Решение, насколько я понимаю, заключается в использовании двух песочниц на проект — одной чистой, содержащей минимальный набор зависимостей, и одной песочницы, предназначенной для разработки. Думаю, такой подход в любом случае не лишен смысла, так как вряд ли вы захотите тянуть на боевой сервер всевозможные моки и фреймворки для тестирования. Что же касается проверки корректности соответствующих файлов requirements.txt, тут на помощь приходит continuous integration. По идее, должно работать.