Виртуальные среды
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 получим следующее:
Сторонние пакеты, установленные при помощи pip
, обычно располагаются в одном из каталогов, на которую указывает site.getsitepackages:
Зачем все эти детали?
Представим, что у нас есть проект А и проект Б. Оба имеют зависимость от одной и той же библиотеки - проект В. Если мы начинаем запрашивать разные версии проекта B, то проблема становится явной.
Дело в том, что Python не может различать версии пакетов в каталоге «site-packages». Проекты хранятся в соответствии с их названиями, нет различий между версиями. Например, если мы посмотрим, что лежит в папке пакета http
, имеющий следующее расположение:
Увидим, что содержимое пакета не лежит в какой-либо папке, обозначающей версию данного пакета (то есть мы можем хранить только одну определенную версию пакета http
):
То есть проект А и проект Б должны будут использовать одну и ту же версию проекта В, что во многих случаях неприемлемо.
Решить данную проблему можно с помощью виртуальных сред.
Что такое виртуальная среда?
Главная задача виртуальной среды Python – создание изолированной среды для проектов Python. Это значит, что каждый проект может иметь свои собственные зависимости, вне зависимости от того, какие зависимости у другого проекта.
В примере выше необходимо просто создать раздельную виртуальную среду для проектов А и Б. Каждая среда, в свою очередь, сможет зависеть от любой версии проекта В, независимо друг от друга.
Это хорошо тем, что у нас нет ограничений на то, в скольких экземплярах будет наша виртуальная среда, так как они являются обычными каталогами, в которых содержится несколько скриптов. Также их очень легко создать при помощи инструментов командной строки.
Использование виртуальной среды
Начиная с версии Python 3.6, рекомендуемый способ создания виртуального пространства - это использование venv
, который включен в инсталляцию по умолчанию. Для создания виртуальной среды в консоли в папке проекта необходимо ввести команду:
Команда создает папку env
в папке с проектом со следующей структурой:
Что находится в этих папках?
Scripts – содержит файлы, которые взаимодействуют с виртуальной средой;
Include – С-заголовки, компилирующие пакеты Python;
Lib – копия версии Python вместе с папкой «site-packages», в которой установлена каждая зависимость.
Для активации виртуальной среды, находясь в папке с проектом, введите команду:
После активации в приглашении командной строки появится префикс виртуальной среды (см. пример работы с виртуальной средой). Это индикатор того, что виртуальная среда в данный момент активна, что в свою очередь говорит о том, что выполнимые файлы Python используют пакеты и настройки только этой среды.
Далее можно устанавливать в эту виртуальную среду пакеты определенных версий и они будут изолированы от тех пакетов, что установлены глобально.
Для деактивации виртуальной среды необходимо ввести команду:
Пример работы с виртуальной средой
Продемонстрируем работу с виртуальной средой на примере.
Выведем список пакетов, установленных глобально. Для этого в консоли введем:
Видим, что глобально в системе, кроме двух стандартных пакетов, ничего не установлено. На рабочем столе создадим папку project
и перейдем в неё:
Далее в папке с проектом создадим виртуальную среду и активируем её:
Заметим, появился префикс (env)
в приглашении командной строки. Выведем список установленных пакетов в виртуальной среде:
Теперь установим в виртуальную среду библиотеку, например, Pillow
и выведем список пакетов, установленных в виртуальной среде:
Деактивируем виртуальную среду и выведем список пакетов:
Вновь отобразятся пакеты, установленные глобально.
Таким образом, мы создали в папке с проектом виртуальную среду, установили в неё библиотеку, а затем деактивировали её.
При работе с проектом каждый раз нужно активировать виртуальную среду и запускать файлы проекта из-под консоли, что весьма неудобно. Поэтому большинство IDE умеют при минимальной первичной настройке запускать проект без проделанных выше манипуляций.
Как работает виртуальная среда?
Какие ещё бывают виртуальные среды?
Last updated