Виртуальные среды
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
Was this helpful?