понедельник, 11 мая 2009 г.

Настройка окружения и развертка. Часть первая — VirtualEnv.

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


  • VirtualEnv

  • Fabric

  • Lighttpd + Flup

Итак. Первая часть будет о средстве для создания виртуальных окружений — VirtualEnv.

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

VirtualEnv может создавать, как полностью изолированные окружения, так и неполностью :). Если окружение изолировано полностью, то никакие системные библиотеки использоваться не будут, если же изоляция не полная, то при отсутствии необходимой библиотеки в окружении, она будет импортироваться из числа системных (если она там есть, конечно).

Приступим. Создадим свое собственное виртуальное окружение, для своего проекта. Для начала нам необходимо установить VirtualEnv

Это можно сделать как (для Debian based систем):

sudo aptitude install python-virtualenv

Или же воспользоваться easy_install

sudo easy_install virtualenv

В конечном итоге в нашей системе появится файлик /usr/bin/virtualenv (это зависит от дистрибутива).

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

$ virtualenv  -p /usr/bin/python2.6 --no-site-packages virtual
Running virtualenv with interpreter /usr/bin/python2.6
New python executable in virtual/bin/python2.6
Also creating executable in virtual/bin/python
Installing setuptools............done.

Поподробнее. Опция -p — указывает на питонячий интерпритатор, который будет использоваться для запуска внутри окружения. Опция --no-site-packages говорит о том, что нам нужно полностью изолированное окружение, и не стоит искать библиотеки в системе, если их нет в окружении. На самом деле рекомендуется хранить глобальные вещи используемые во всех проектах, в системных библиотеках, а индивидуальные для проекта — в окружении, т.е. создавать неполностью изолированные среды. Итак окружение создано в папке virtual. Заходим туда и смотрим:

$ ls -R ./
./:
bin include lib

./bin:
activate activate_this.py easy_install easy_install-2.6 python python2.6

...

Как видим, VirtualEnv любезно подложил туда скрипт easy_install, чтобы нам было проще устанавливать пакеты в окружение. Все приложения запущенные через ./bin/python будут работать внутри изолированной среды. Если возможность запустить приложение через ./bin/python отсутствует, то внутри приложения мы должны сделать импорт ./bin/activate, для активации режима работы внутри виртуальной среды.

Теперь установим все необходимое для работы, с помощью easy_install (для управления пакетами, можно также воспользоваться http://pypi.python.org/pypi/pip).

$ ./bin/easy_install django
Searching for django
Reading http://pypi.python.org/simple/django/
Reading http://www.djangoproject.com/
Reading http://www.djangoproject.com/download/1.0.1-beta-1/tarball/
Best match: Django 1.0.2-final
Downloading http://media.djangoproject.com/releases/1.0.2/Django-1.0.2-final.tar.gz
...

(и так далее).

Когда все пакеты для запуска проекта готовы, запустим джанговый дев-сервер:

./bin/python /path/to/project/manage.py runserver

Validating models...
0 errors found

Django version 1.0.2 final, using settings 'forwp.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Как видим — все работает. Окружений может быть много и для каждого проекта свое. Это действительно удобно.

2 комментария:

  1. такс, а теперь возможно наивный вопрос - VirtualEnv изолирует полностью среду выполнения проекта или всетакие есть возможность запустить скрипт, который допустим залезет в другой проект и прочитает/запишет что-то в нем?

    ОтветитьУдалить
  2. @_b1 VirtualEnv он не изолирует среду выполнения, он предоставляет окружение выполнения. Т.е. ответ на вопрос - да.

    ОтветитьУдалить