При разработке проектов на языке 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
На этом пожалуй все! :)