камплюхтеры
May 9, 2022

🛠 Использование virtualenv

В этом посте я попробую объяснить что такое virtualenv, для чего он нужен и как им пользоваться python-разработчику. Погнали.


🛫 Введение

Давайте начнём с серии вопросов, которые я когда-то задавал сам себе, и ответов, которые я сегодняшний могу дать себе тогдашнему.

Вопрос: Что такое virtualenv и почему мне обязательно нужно научиться им пользоваться?

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

Вопрос: Изолированное?

Ответ: Да, именно изолированное. Это очень важно. Если вы работаете только над одним проектом всю жизнь, то проблемы нет. Но если проектов больше одного, и вы используете в них разные наборы пакетов, то в какой-то момент уже не сможете вспомнить какому проекту какие пакеты нужны. А ещё нужно помнить о версиях, чтобы всё не рассыпалось. Можно, конечно, записывать на бумажку, но это не путь джедая.

Вопрос: Как этим пользоваться?

Ответ: Условно работу с virtualenv можно разбить на несколько этапов, каждый из которых я постараюсь подробно описать в посте:

  • Установка virtualenv
  • Создание окружения
  • Активация окружения
  • <Здесь мы работаем как обычно, не обращая особого внимания на то, что мы находимся в каком-то там виртуальном окружении>
  • Перенос окружения
  • Деактивация окружения

Вопрос: Когда нужно использовать virtualenv?

Ответ: Я считаю, что всегда. Дело в том, что результатом разработки любой программы является её запуск на компьютере, который отличается от вашего. Это может быть какой-то сервер или машина другого пользователя. Использование virtualenv позовляет минимизировать опасность ставшей шуткой ситуации “Ну, не знаю, у меня на компе всё работает!”

🚀 Поехали!

Сейчас я расскажу подробно про каждый из этапов работы с virtualenv на примере. Уточню, что всё это я делаю только на Linux (Manjaro в моём случае), т.к. это моя основная рабочая система. Многое будет актуально и для Windows, но некоторые шаги будут отличаться, и придётся гуглить. Сорян.

1. Установка virtualenv

Не уверен на 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, но если у вас другая, вы вряд ли почувствуете разницу.

2. Создание окружения

Переходим к работе непосредственно с 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

Круто! Пока всё идёт по плану.

3. Активация окружения

Окружение создано. Теперь чтобы его использовать мы должны выполнить активацию. Это значит, что мы “переключаем контекст” выполнения команд связанных с 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

Их будет больше, чем мы устанавливали, т.к. большинство из них подтянет свои зависимости + что-то устанавливается, когда вы только создаёте окружение.

Теперь вы работаете, пишете код, устанавливаете в ваше виртуальное окружение ещё какие-то пакеты. Снова пишете. Снова устанавливаете…

5. Перенос окружения

И вот настаёт счастливый день, когда вы хотите поделиться своим кодом с миром. Для этого нам нужно не только дать возможность скачать код из, например, 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

Вуаля! Когда процесс установки пакетов завершится, вы будете иметь на продкашн системе ровно такое же окружение, какое было у вас на рабочей системе, и тем самым сможете как минимум минимизировать (извините за тавтологию) проблемы с несовместимостью версий.

6. Деактивация окружения

Последний и самый простой этап работы с virtualenv. Чтобы покинуть контекст вашего виртуального окружения и вернуться в систему, вам нужно выполнить

$ deactivate

Да-да, так всё просто. Но старайтесь следить за тем, где вы находитесь (на какой машинке, в каком виртуальном окружении и т.д.), чтобы не сделать чего лишнего. Был случай, когда товарищ из, кажется, гитлаба перепутал окна консоли и удалил рабочую базу. С виртуальным окружением проблем такого масштаба у вас скорее всего не произойдёт, но лучше быть начеку.

🛬 Эпилог

Virtualenv очень простой, но одновременно мощный и важный инструмент в арсенале любого питониста. Это то, что принято называть “must have”, и начинать им пользоваться лучше с самого начала. Учиться, так сказатб, хорошему. Это позволит избежать множества проблем при работе в команде, при работе на нескольких машинах (например, у вас дома есть ноутбук и десктоп, и вы разрабатываете на обоих), а так же сделает вашу жизнь чуточку удобнее, а волосы шелковистее.


❓ Остались вопросы? Не стесняйтесь задавать их в комментариях. ;)