Работа с virtualenv

26 May 2013

При разработке проектов на языке Python мы постоянно используем сторонние библиотеки. Для работы с зависимостями стандартом де-факто в питон разработке служит утилита pip, которая пришла на смену утилите easy_install.

До того как появилась virtualenv с зависимостями мы работали так:

sudo pip install Django

При таком подходе все библиотеки устанавливаются в системную директорию Python (/usr/lib/python2.7/dist-packages). Вас это может вполне устраивать до определенного момента. Например когда вы работаете с большим количеством проектов на Python, и у каждого свои зависимости. Это может привести вас к разным ситуациям, например конфликт версий библиотек. Для решения этой проблемы был придуман подход изоляции всего окружения проекта. Это удобно, у каждого проекта свой набор библиотек, свое окружение.

Как это выглядит на самом деле?

Будем считать что у вас в системе уже установлен pip. Ставим virtualenv.

sudo pip install virtualenv

Проблем с установкой возникнуть не должно. Опробуем работу virtualenv на тестовом проекте с использованием веб-микрофреймворка Flask. В качестве системы контроля версий у нас будет использоваться Mercurial.

cd ~
mkdir my_project && cd my_project
mkdir venv && echo "Virtualenv directory" > venv/README
echo "./venv/*" >> .hgignore
cd venv && virtualenv --no-site-packages my_project

Таким образом мы создали директорию проекта. Определили в нем директорию для virtualenv и сказали, что будем использовать ее для работы с проектом my_project. Запустим наше окружение.

cd ..
source ./venv/my_project/bin/activate

После выполнения этих команд мы увидим, что изменилось приглашение командной строки. У меня оно выглядит так:

(my_project)[~]$ 

Это говорит о том, что мы работаем сейчас в виртуальном оркужении проекта my_project. Попробуем установить первую библиотеку в наше окружение, ей как раз и станет фреймворк Flask.

pip install Flask

Отлично, все установилось. Создадим небольшой проект на Flask для проверки работоспособности нашего окружения. Для этого в директории проекта создадим файл hello.py со следующим содержимым:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

Запускаем!

python hello.py

Проверяем доступность нашего проекта по адресу http://127.0.0.1:5000/

Если вы заметили, ранее, при создании виртуального окружения я в файл .hgignore добавил всю папку venv. Нам не нужно хранить всю эту свалку библиотек проекта в репозитарии. Для этого мы создадим файл, описывающий зависимости нашего проекта командой:

pip freeze > req.txt

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

pip install -r req.txt

На этом пожалуй все! :)


comments powered by Disqus