Проблема с использованием разных версий софта практически настолько же стара как мир разработки этого самого софта. Смотря со стороны разработчика, то самый простой случай - это когда нужно пофиксить какие-либо баги в предыдущей версии. Проблема заключается в том, что для dev environment уже используется более новая версия python, django и/или другого, необходимого для проекта, ПО. В более “тяжелом” случае все становится еще интересней: в production одно, на stage -  другое, на машине разработчика - третье, а тут еще нужно писать под google app engine, для которого требуются специфические (старые) версия python/django. 

Первой моей идеей было поднять разные виртуалки для тестирования, но немного погуглив наткнулся на такую замечательную вещь, как virtualenv. Как написано на оффициальном сайте - “virtualenv is a tool to create isolated Python environments”, что в переводе звучит, примерно, так: “virtualenv - приложение для созданий изолированных рабочих сред для python”. Таким образом вы можете создать несколько окружений с разными версиями python и/или других библиотек. 

Установка virtualenv ничем не отличается от установки любой библиотеки, написанной на python. В моем случае установка выглядила так:

sudo easy_install virtualenv

После установки virtualenv процесс создание виртуального окружения состоит всего лишь из одной команды:

virtualenv -p /usr/bin/python2.5 ./gae/

Здесь с помощью параметра -p я указал версию python, которую необходимо использовать для виртуального окружения. Последним параметром идет путь к  директории, в которой необходимо все создать. Так же рекомендуется добавлять параметр --no-site-packages, для того, чтобы из виртуального окружения не было доступа к пакетам из “реальной” среды (из встроенной справки: Don't give access to the global site-packages dir to the virtual environment). У себя этот параметр я не использовал по следующей причине: на рабочем PC mbp я использую такую схему библиотек:

  • последняя версия python и необходимых библиотек устанавливается обычным образм, без virtualevn;
  • если для каких-то причин необходимы другие версии интерпретатора или библиотек - создаю virtualenv;
  • в virtualenv доустанавливаю только те библиотеки, версии которых должны отличаться от реальной среды моей ОС (в моем случае - необходимо использовать более старую версию).

Теперь, после создания virtualenv появилась такая структура папок:

bin include lib

В Windows-like OS структура папок может немного отличаться.

$ python --version

Python 2.6.5

$  ./bin/python --version

Python 2.5.4

Например, мне нужно запустить GAE-приложение с использованием django.  Если я его запущу в текущей конфигурации моей рабочей машины, то получу следеющую ошибку:

UnacceptableVersionError: django 1.0 was requested, but 1.2.1.final.0 is already in use.

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

Для переключения в виртуальное окружение проще всего использовать скрипт activate, который лежит в каталоге bin нашего  vitrualevn:

e0ne-macbook:gae e0ne$ source bin/activate

(gae)e0ne-macbook:gae e0ne$ python --version

Python 2.5.4

Для выхода из виртуального окружения существует команда deactivate:

(gae)e0ne-macbook:gae e0ne$ deactivate 

e0ne-macbook:gae e0ne$ 

Перейдем непосредственно к установке djngo в созданное виртуальное окружение. Установка любого python-пакета в virtualenv ничем не отличается от обычного процесса установки и выполняется всем знакомой командой:

(gae)e0ne-macbook:Django-1.0.4 e0ne$ python setup.py install

Теперь у меня есть 2 полноценных рабочих среды с простым и быстрым переключением между ними.

Я описал лишь базовые возможности пакета virtualenv, но и этого вполне достаточно для того, чтобы увидеть всю его мощь, спрятанную я простым и понятным интерфейсом. Как всегда, все подробности на оффициальной странице: http://pypi.python.org/pypi/virtualenv


Comments

brabadu Ukraine

Monday, January 3, 2011 7:03 PM

brabadu

Ну если уж про virtualenv зашел разговор, то ставить через python setup.py install крайне не рекомендуется. Существует намного более простой и удобный способ - pip. В консоли, из-под виртуального окружения: pip install Django и вуаля, свежая версия джанги установлена в это окружение. Плюс в том, что pip сам ищет пакеты (можно задавать конкретную версию), имеет возможность их потом красиво удалить, при необходимости и заморозить изменения, т.е. сгенерировать файлик, который будет содержать все пакеты (с версиями!!!). И если будет необходимо развернуть рабочее окружение где-то опять, то все что надо будет сделать это запустить pip install -r requirements.txt А если в базе пакетов не будет необходимого, то можно его поставить (как пакет, т.е. с возможностью последующего удаления/апгрейда) и прямо из git/svn/hg/bzr репозиториев. Но это уже можно и погуглить Smile  Короче говоря, рекомендую попробовать pip, могучая вещь.

e0ne Ukraine

Monday, January 3, 2011 7:07 PM

e0ne

Спасибо за замечание о pip, обязательно попробую. А почему в виртуальном окружении не рекомендуется использовать setup.py install, какие при этом могут быть подводные камни?

brabadu Ukraine

Tuesday, January 18, 2011 12:49 AM

brabadu

Прошу прощения, что не отвечал. Забыл как-то за этот комментарий, а уведомление или не дошло, или на галочку не нажал в прошлый раз.

Я, может, о setup.py отозвался излишне резко, не самый страшный вариант. Главных минусов два - не поддерживает зависимости (и не скажет, чего вам не хватает, если что) и приходится делать лишние телодвижения для поиска нужного пакета, скачивания и установки. В то время как все это можно сделать одной, даже немного более короткой, командой Smile

easy_install - попытка улучшить setup.py, а pip - улучшение easy_install. Как-то так.

brabadu Ukraine

Tuesday, January 18, 2011 12:51 AM

brabadu

Про все эти вещи можно детальнее прочитать тут:
dubroy.com/.../
www.b-list.org/weblog/2008/dec/14/packaging/
http://www.b-list.org/weblog/2008/dec/15/pip/

Блоги не мои, не реклама  Smile

e0ne Ukraine

Saturday, January 22, 2011 8:41 PM

e0ne

Спасибо за ссылки, обязательно прочитаю.

P.S. Сейчас временные проблемы с нотификацией.

Comments are closed