Виртуальные среды

Yo dawg, I heard you like python... so I put a venv in your venv so you can code while you code

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

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

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

Вы можете легко найти, где именно sys.prefix указывает на использование оболочки Python. Для Windows в интерпретаторе Python получим следующее:

>>> import sys
>>> print(sys.prefix)
C:\Users\User\AppData\Local\Programs\Python\Python39

Сторонние пакеты, установленные при помощи pip, обычно располагаются в одном из каталогов, на которую указывает site.getsitepackages:

>>> import site
>>> print(site.getsitepackages())
['C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python39', 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages']

Зачем все эти детали?

Представим, что у нас есть проект А и проект Б. Оба имеют зависимость от одной и той же библиотеки - проект В. Если мы начинаем запрашивать разные версии проекта B, то проблема становится явной.

Дело в том, что Python не может различать версии пакетов в каталоге «site-packages». Проекты хранятся в соответствии с их названиями, нет различий между версиями. Например, если мы посмотрим, что лежит в папке пакета http, имеющий следующее расположение:

C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\http

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

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

Решить данную проблему можно с помощью виртуальных сред.

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

Главная задача виртуальной среды Python – создание изолированной среды для проектов Python. Это значит, что каждый проект может иметь свои собственные зависимости, вне зависимости от того, какие зависимости у другого проекта.

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

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

Использование виртуальной среды

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

$ python -m venv env

Команда создает папку env в папке с проектом со следующей структурой:

├── Scripts
   ├── activate
   ├── activate.bat
   ├── activate.ps1
   ├── deactivate.bat
   ├── easy_install.exe
   ├── easy_install-3.9.exe
   ├── pip.exe
   ├── pip3.9.exe
   ├── pip3.exe
   ├── python.exe
   └── pythonw.exe
├── Include
├── Lib
   └── site-packages/
└── pyvenv.cfg

Что находится в этих папках?

  • Scripts – содержит файлы, которые взаимодействуют с виртуальной средой;

  • Include – С-заголовки, компилирующие пакеты Python;

  • Lib – копия версии Python вместе с папкой «site-packages», в которой установлена каждая зависимость.

Для активации виртуальной среды, находясь в папке с проектом, введите команду:

$ env\scripts\activate

После активации в приглашении командной строки появится префикс виртуальной среды (см. пример работы с виртуальной средой). Это индикатор того, что виртуальная среда в данный момент активна, что в свою очередь говорит о том, что выполнимые файлы Python используют пакеты и настройки только этой среды.

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

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

$ env\scripts\dectivate.bat

Пример работы с виртуальной средой

Продемонстрируем работу с виртуальной средой на примере.

Выведем список пакетов, установленных глобально. Для этого в консоли введем:

Видим, что глобально в системе, кроме двух стандартных пакетов, ничего не установлено. На рабочем столе создадим папку project и перейдем в неё:

Далее в папке с проектом создадим виртуальную среду и активируем её:

Заметим, появился префикс (env) в приглашении командной строки. Выведем список установленных пакетов в виртуальной среде:

Теперь установим в виртуальную среду библиотеку, например, Pillow и выведем список пакетов, установленных в виртуальной среде:

Деактивируем виртуальную среду и выведем список пакетов:

Вновь отобразятся пакеты, установленные глобально.

Таким образом, мы создали в папке с проектом виртуальную среду, установили в неё библиотеку, а затем деактивировали её.

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

Как работает виртуальная среда?

Какие ещё бывают виртуальные среды?

Last updated