Virtualenv
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, поддерживать и развивать весь зоопарк проектов стало значительно легче. Рекомендую.