Виртуальные среды (venv) в Python

Виртуальные среды Python (англ. virtual enviroment, сокращенно venv или virtualenv) позволяют устанавливать пакеты Python в изолированном от остальной части вашей системы месте. Давайте посмотрим, как их использовать для вашей работы.

Оглавление

Зачем нужны виртуальные среды

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

Предотвращение конфликтов версий

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

Предположим, ваш проект, назовем его Проект А, написан на основе конкретной версии библиотеки X. В будущем вам может потребоваться обновить библиотеку X. Скажем, вам нужна последняя версия для другого начатого вами проекта под названием Проект Б. Вы обновляете библиотеку X до последней версии, и проект B работает нормально. Прекрасно, но после этого выясняется, что код Проекта А неисправен. При обновлении версий интерфейс может быть серьезным образом изменен.

Виртуальная среда решает эту проблему, изолируя ваш проект от других проектов и общесистемных пакетов. Вы устанавливаете пакеты внутри этой виртуальной среды специально для проекта, над которым работаете.

Легкость воспроизведения и установки

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

Работает везде, даже без прав администратора (root)

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

Альтернативы виртуальных сред

Есть и другие варианты для изоляции вашего проекта:

  1. В самом крайнем случае можно купить второй компьютер и запускать на нем свой код. Проблема решена! Хотя это было бы немного дороговато!
  2. Виртуальная машина — гораздо более дешевый вариант, но она все равно требует установки полной операционной системы, что в большинстве случаев также является расточительством.
  3. Хорошей альтернативой является контейнеризация, например Docker или Kubernetes. Это весьма мощные инструменты для разработки.

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

Как создать виртуальную среду

Существует несколько способов создания виртуальной среды в зависимости от используемой версии Python.

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

Python 3.4 и выше

Если вы используете Python 3.4+, то модуль venv уже встроен в него.

python -m venv <directory>

Эта команда создает виртуальную среду в указанном каталоге и также копирует в него пакетный менеджер pip. Если вы не решили, как назвать каталог: обычно по умолчанию используется название venv; это не дает никому усомнится, что там такое. Таким образом, команда в этом случае будет выглядеть вот так:

python -m venv venv

Чуть дальше в этой статье мы внимательно рассмотрим только что созданный каталог. Но сначала посмотрим, как активировать эту виртуальную среду.

Другие версии Python

Альтернативой, которая работает для любой версии Python, является использование пакета virtualenv. Но для этого его надо сначала установить:

pip install virtualenv

После установки можно создать виртуальную среду с помощью следующей команды:

virtualenv [directory]

Активация виртуальной среды

Способ активации виртуальной среды зависит от используемой вами ОС.

Активация виртуальной среды в Windows

Чтобы активировать виртуальную среду в Windows, вам необходимо запустить скрипт, который устанавливается вместе с ней. Если вы создали свою виртуальную среду в каталоге с именем venv, то команда будет выглядеть следующим образом:

# In cmd.exe
venv\Scripts\activate.bat
# In PowerShell
venv\Scripts\Activate.ps1

Активация виртуальной среды в Linux и MacOS

В Linux и MacOS мы активируем виртуальную среду при помощи команды source. Если вы создали свою виртуальную среду в каталоге myvenv, то команда будет выглядеть так:

$ source myvenv/bin/activate

Вот и все! Мы готовы к работе! Теперь можно устанавливать пакеты при помощи пакетного менеджера pip, но мы советуем вам продолжить чтение, чтобы лучше понять механизмы работы виртуальных сред.

Как в Python работают виртуальные среды

При активации виртуальной среды изменяется переменная PATH. В Linux и MacOS это можно увидеть, распечатав ее с помощью команды echo $PATH. В Windows используется команда echo %PATH% (в cmd.exe) или команда $Env:Path (в PowerShell). В нашем случае под Windows это выглядит следующим образом:

C:\Users\erik\Dev\venv\Scripts;C:\Program Files\PowerShell\7;C:\Program Files\AdoptOpen....

Это длинный список, и мы показали только его начало. Как видите, каталог Scripts моей виртуальной среды помещен впереди всех других каталогов, фактически переопределяя все общесистемные программы Python.

Что же делает переменная PATH?

Когда вы вводите команду, которая не может быть найдена в текущем рабочем каталоге, ваша ОС начинает просматривать все пути в переменной PATH.

То же самое происходит и с Python. Когда вы импортируете библиотеку, Python просматривает PATH на предмет расположения библиотеки. И вот тут-то и происходит наша магия с виртуальной средой: если виртуальная среда находится перед всеми остальными путями, то ОС будет искать сначала в ней, а потом уже обращаться к общесистемным каталогам, таким как /usr/bin. Таким образом, все, что установлено в нашей виртуальной среде, будет найдено первым, и именно так мы можем переопределять общесистемные пакеты и инструменты.

Что находится внутри виртуальной среды?

Если заглянуть в каталог виртуальной среды, то под операционной системой Windows вы увидите примерно следующее:

.
├── Include
├── Lib
│   └── site-packages
├── pyvenv.cfg
└── Scripts
    ├── activate
    ├── activate.bat
    ├── Activate.ps1
    ├── deactivate.bat
    ├── pip3.10.exe
    ├── pip3.exe
    ├── pip.exe
    ├── python.exe
    └── pythonw.exe

А под Linux и MacOS вот что:

Можно заметить, что:

  • доступны команды python и python3 (в Linux и MacOS), причем версия соответствует версии Python, в которой была создана виртуальная среда
  • в операционной системе Windows двоичный файл Python копируется в каталог scripts
  • все устанавливаемые пакеты попадают в каталог site-packages
  • у нас есть скрипты активации для различных типов оболочек (bash, csh, fish, PowerShell)
  • пакетный менеджер pip можно запускать посредством команд pip и pip3 и даже pip3.7, так как на момент установки виртуальной среды у нас была версия Python 3.7.

Деактивация виртуальной среды

По окончании работы над проектом рекомендуется деактивировать его виртуальную среду. Деактивация означает выход из данной виртуальной среды. Без деактивации виртуальной среды весь остальной выполняемый вами Python-код, даже если он находится вне каталога проекта, также будет выполняться внутри этой виртуальной среды.

К счастью, деактивация виртуальной среды крайне проста. Просто введите команду deactivate. Это работает одинаково во всех операционных системах.

Удаление виртуальной среды

Виртуальную среду можно полностью удалить, но как это сделать, зависит от того, что именно использовалось для ее создания. Рассмотрим наиболее распространенные варианты.

Удаление виртуальной среды, созданной при помощи команды Virtualenv или python -m venv

Если для создания виртуальной среды вы использовали команды virtualenv или python -m venv, как это было показано выше в данной статье, то какой-либо специальной команды для ее удаления не существует. При создании виртуальной среды вы задали каталог, в котором было создано данное окружение.

Если вы хотите удалить эту виртуальную среду, то сначала деактивируйте ее, а затем удалите ее каталог со всем его содержимым. В Unix-подобных системах и в Windows PowerShell это можно сделать следующим образом:

deactivate
# Если ваша виртуальная среда находится в каталоге под названием 'venv':
rm -r venv

Удаление виртуальной среды, созданной при помощи Pipenv

Если для создания виртуальной среды вы использовали Pipenv, то все гораздо проще. Для ее удаления можно воспользоваться следующей командой:

pipenv --rm

Только убедитесь, что вы находитесь в каталоге проекта. Другими словами, в каталоге, где находятся файлы Pipenv и Pipenv.lock. Таким образом pipenv узнает, какое виртуальное окружение ему нужно удалить.

Если это не сработало, можно поступить немного грубее и удалить виртуальную среду вручную. Сначала спросите у pipenv, где находится данная виртуальная среда, выполнив следующую команду:

pipenv --env
/home/username/.local/share/virtualenvs/yourproject-IogVUtsM

Данная команда выведет путь к виртуальной среде и всем ее файлам, который будет выглядеть примерно так, как показано выше. Следующим шагом будет удаление всего этого каталога. И все, дело сделано.

Удаление виртуальной среды, созданной при помощи Poetry

Если вы создали виртуальную среду при помощи Poetry, то список доступных сред можно составить при помощи следующей команды:

poetry env list

Вы получите примерно такой список:

test-O3eWbxRl-py2.7
test-O3eWbxRl-py3.6
test-O3eWbxRl-py3.7 (Activated)

Удалить нужное окружение можно с помощью команды poetry env remove. При этом необходимо указать точное имя среды из приведенного выше вывода, например:

poetry env remove test-O3eWbxRl-py3.7

Заключение

Вы узнали, как создавать, активировать, деактивировать и удалять виртуальные среды. Мы также слегка заглянули за ширму, чтобы узнать, как работает виртуальная среда и для чего она нужна.

Теперь, когда вы знаете, как создавать виртуальные среды, вам необходимо научиться устанавливать в них пакеты. Для этого мы настоятельно рекомендуем вам познакомиться с Pipenv или Poetry. Эти инструменты объединяют управление виртуальной средой с правильным управлением пакетами и зависимостями.

Перевод статьи «Python venv: How To Create, Activate, Deactivate, And Delete».