🛠 Использование virtualenv
В этом посте я попробую объяснить что такое virtualenv, для чего он нужен и как им пользоваться python-разработчику. Погнали.
Давайте начнём с серии вопросов, которые я когда-то задавал сам себе, и ответов, которые я сегодняшний могу дать себе тогдашнему.
Вопрос: Что такое virtualenv и почему мне обязательно нужно научиться им пользоваться?
Ответ: Virtualenv — это утилита, которая позволяет создавать изолированные виртуальные окружения для Python. По сути, она создаёт внутри вашего проекта каталог, в который кладёт нужную вам версию Python и туда же устанавливает все необходимые пакеты, которые вы будете использовать в своём приложении, фреймворке, скрипте. В результате вы получаете полностью рабочее, изолированное и, что очень важно в дальнейшем, переносимое окружение.
Ответ: Да, именно изолированное. Это очень важно. Если вы работаете только над одним проектом всю жизнь, то проблемы нет. Но если проектов больше одного, и вы используете в них разные наборы пакетов, то в какой-то момент уже не сможете вспомнить какому проекту какие пакеты нужны. А ещё нужно помнить о версиях, чтобы всё не рассыпалось. Можно, конечно, записывать на бумажку, но это не путь джедая.
Вопрос: Как этим пользоваться?
Ответ: Условно работу с virtualenv можно разбить на несколько этапов, каждый из которых я постараюсь подробно описать в посте:
- Установка virtualenv
- Создание окружения
- Активация окружения
- <Здесь мы работаем как обычно, не обращая особого внимания на то, что мы находимся в каком-то там виртуальном окружении>
- Перенос окружения
- Деактивация окружения
Вопрос: Когда нужно использовать virtualenv?
Ответ: Я считаю, что всегда. Дело в том, что результатом разработки любой программы является её запуск на компьютере, который отличается от вашего. Это может быть какой-то сервер или машина другого пользователя. Использование virtualenv позовляет минимизировать опасность ставшей шуткой ситуации “Ну, не знаю, у меня на компе всё работает!”
🚀 Поехали!
Сейчас я расскажу подробно про каждый из этапов работы с virtualenv на примере. Уточню, что всё это я делаю только на Linux (Manjaro в моём случае), т.к. это моя основная рабочая система. Многое будет актуально и для Windows, но некоторые шаги будут отличаться, и придётся гуглить. Сорян.
Не уверен на 200%, но кажется, что у меня virtualenv был установлен в Manjaro с самого начала. Если у вас не так, то установить его очень просто, используя менеджер пакетов pip:
# pip install virtualenv
Обратите внимание, что первым символом идёт “#”, а это значит, что команда должна быть выполнена под root’ом. Это важно. В противном случае вы увидите сообщение, а-ля ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: ‘/usr/lib/python3.8/site-packages/wcwidth-0.1.7.dist-info’
. Нам это не нужно, поэтому либо смените пользователя через
$ su
и после этого выполните первую команду, либо сразу выполните её с sudo:
$ sudo pip install virtualenv
Символ $
в начале говорит о том, что команда выполняется из-под не привилегированного пользователя.
Вряд ли что-то пошло не так, и после установки вы можете проверить, что virtualenv установлен и посмотреть какая у вас версия:
$ virtualenv --version
У меня 16.7.9, но если у вас другая, вы вряд ли почувствуете разницу.
Переходим к работе непосредственно с virtualenv. Например, вы начинаете проект my_project, который будет храниться у вас в домашней директории в директории Projects, т.е. /home/<your_username>/Projects/my_project
. В моём случае это /home/dmrlx/Projects/my_project
. Переходим в эту директорию:
$ cd /home/dmrlx/Projects/my_project
Теперь создаём в этой папке окружение. У меня в системе установлено два интерпретатора: 2.7.17 и 3.8.0. Например, установим virtualenv с Python 3.8:
$ virtualenv venv --python=python3.8
“venv” в данном случае — это название директории, в которой будет развёрнуто ваше виртуальное окружение, по сути его имя. Может быть любым другим, но, если честно, ни разу не встречал, чтобы кто-то писал что-то кроме venv. Возможно, разные имена имеют смысл, если у вас одновременно десяток проектов и нужно избежать путаницы.
Часть после “venv” вообще можно опустить. В этом случае виртуальное окружение установится с той версией, которая задана у вас в системе по умолчанию.
Если теперь мы посмотрим на содержимое директории “my_project” (в которой сейчас находимся), то увидим, что в ней действительно появилась директория “venv”, а внутри неё, в свою очередь, ещё три: “bin”, “include” и “lib”.
$ ls venv bin include lib
Круто! Пока всё идёт по плану.
Окружение создано. Теперь чтобы его использовать мы должны выполнить активацию. Это значит, что мы “переключаем контекст” выполнения команд связанных с python на виртуальное окружение. Если проще, то после активации, выполняя любой python скрипт, мы будем использовать python и установленные пакеты не из системы, а из нашего виртуального окружения.
$ source venv/bin/activate
Как только вы это сделаете, перед строкой приглашения вашей консоли появится “(venv)”, например у меня (было > стало):
“[dmrlx@vws my_project]$” > “(venv) [dmrlx@vws my_project]$”
Это значит, что контекст переключен и теперь мы используем виртуальное окружение! И это очень круто!
4. <Здесь мы работаем как обычно, не обращая особого внимания на то, что мы находимся в каком-то там виртуальном окружении>
Например, вам нужно установить некоторое количество пакетов, чтобы использовать в вашем фреймворке. Возьму что-нибудь из своих рабочих: paramiko, pycodestyle, pydocstyle, pylint, pytest, pytest-html, requests, SQLAlchemy. Устанавливаем (здесь “(venv) $” обращает внимание, что мы выполняем операцию с активированным виртуальным окружением):
(venv) $ pip install paramiko pycodestyle pydocstyle pylint pytest pytest-html requests SQLAlchemy
Когда процесс установки завершится, мы можем поглядеть список установленых пакетов:
(venv) $ pip list
Их будет больше, чем мы устанавливали, т.к. большинство из них подтянет свои зависимости + что-то устанавливается, когда вы только создаёте окружение.
Теперь вы работаете, пишете код, устанавливаете в ваше виртуальное окружение ещё какие-то пакеты. Снова пишете. Снова устанавливаете…
И вот настаёт счастливый день, когда вы хотите поделиться своим кодом с миром. Для этого нам нужно не только дать возможность скачать код из, например, github или gitlab, но и развернуть ТОЧНО ТАКОЕ ЖЕ окружение, какое было на вашей системе. Вот тут-то мы и начинаем понимать всю прелесть virtualenv’a. У нас уже есть это окружение, и нужно перенести его с вашей системы на внешнюю.
Для начала делаем “слепок” списка пакетов с их версиями:
(venv) $ pip freeze > requirements.txt
pip freeze — команда, которая выводит список всех установленных пакетов с их версиями
> — символ перенаправления вывода
requirements.txt — имя файла, куда мы складываем список пакетов из pip freeze; можно назвать иначе, но так принято )
Файл “requirements.txt” можно и нужно хранить в корне вашего проекта (прямо в директории my_project) и отдавать его в продакшн вместе с кодом. Это хороший тон. А вот класть в репозиторий папку с вашим виртуальным окружением — моветон и “так уже не носят”. Чтобы избежать этого, можете использовать файл .gitignore.
Итак, вы скачали файл requirements.txt вместе с вашим репозиторием на новую машину, и теперь вам нужно развернуть точно такое же окружение, какое было у вас на рабочей системе. Для этого вы по очереди выполняете команды из этого мануала, чтобы создать виртуальное окружение:
$ sudo pip install virtualenv $ cd <путь_к_репозиторию> $ virtualenv venv --python=<ваша_версия_python> $ source venv/bin/activate
и теперь устанавливаете необходимые вам пакеты, используя requirements.txt:
$ pip install -r requirements.txt
Вуаля! Когда процесс установки пакетов завершится, вы будете иметь на продкашн системе ровно такое же окружение, какое было у вас на рабочей системе, и тем самым сможете как минимум минимизировать (извините за тавтологию) проблемы с несовместимостью версий.
Последний и самый простой этап работы с virtualenv. Чтобы покинуть контекст вашего виртуального окружения и вернуться в систему, вам нужно выполнить
$ deactivate
Да-да, так всё просто. Но старайтесь следить за тем, где вы находитесь (на какой машинке, в каком виртуальном окружении и т.д.), чтобы не сделать чего лишнего. Был случай, когда товарищ из, кажется, гитлаба перепутал окна консоли и удалил рабочую базу. С виртуальным окружением проблем такого масштаба у вас скорее всего не произойдёт, но лучше быть начеку.
🛬 Эпилог
Virtualenv очень простой, но одновременно мощный и важный инструмент в арсенале любого питониста. Это то, что принято называть “must have”, и начинать им пользоваться лучше с самого начала. Учиться, так сказатб, хорошему. Это позволит избежать множества проблем при работе в команде, при работе на нескольких машинах (например, у вас дома есть ноутбук и десктоп, и вы разрабатываете на обоих), а так же сделает вашу жизнь чуточку удобнее, а волосы шелковистее.
❓ Остались вопросы? Не стесняйтесь задавать их в комментариях. ;)