Александр Кошелев
Александр Кошелев Python-разработчик

virtualenv: виртуальные окружения

Много у вас разных питонячих проектов работают на одном сервере? У меня вот да. Все ли они использую одни и те же библиотеки или версии библиотек? Нет. Так как сделать, чтобы можно было удобно поддерживать всё это многообразие?

Давным дано я предлагал один вариант - использовать svn:externals и таскать зависимости (код сторонних библиотек и приложений) с собой. Но такой способ очень ограничен в своем применении. Вы должны использовать VCS (subversion или иные поддерживающие аналогичные концепции) для развертывания проекта на сервере и все зависимости тоже должны быть доступны в той же системе контроля версий. Но так случается очень редко. Да и потом далеко не всегда VCS вообще используются для выкладки проектов. Пакетные системы во многих случаях удобней.

Создание изолированных окружений задача довольно давнишняя. И в питонячем мире решается разными способами уже давно. Одним из инструментов является - virtualenv.

Создать окружение просто:

virtualenv myenv

После выполнения этой команды создается директория myenv в который находится некое подмножество unix-like корневой файловой системы. В директории myenv/bin будет лежать бинарник питона, и несколько дополнительных скриптов. В myenv/lib - дерево каталогов, повторяющее оное у текущего установленного питона в системе.

Для того чтобы питонячий код работал в этом окружении, его надо запускать, используя myenv/bin/python, или подключив к своему скрипту вспомогательный модуль myenv/bin/activate.

Так же в myenv/bin будет специальный easy_install скрипт, через который можно устанавливать в это окружение дополнительные пакеты.

На самом деле это окружение не совсем изолированное. Если какой-то пакет не установлен в нем самом, то будет использован тот который установлен глобально в системе (если там он всё-таки есть). В большинстве случаев это удобно. Имеет смысл железобетонные пакеты, которые не часто обновляются, иметь не в каждом окружении отдельно, а глобально в системе, чтобы все могли им пользоваться.

Но это окно в глобальный мир можно закрыть - достаточно при создании окружения указать опцию --no-site-packages. В таком случае доступ из окружение к глобально установленным пакетам будет закрыт.

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

Причем при таком подходе я смог добиться повторяемости установок - я могу установить неограниченное число инстансов проекта на один сервер с нуля. И все они будут независимы друг от друга и изменения в одном никак не затрагивают другие.

Построив систему на базе независимых окружений совместно с pip и fabric, поддерживать и развивать весь зоопарк проектов стало значительно легче. Рекомендую.

comments powered by Disqus