При установки библиотек, по умолчанию pip
устанавливает пакеты как бы глобально. Это работает нормально, если пишите вы небольшие скрипты, не имеющие огромного количества библиотек. Но если у вас в несколько больших проектов, в которых используется что-то тяжелое и ломающее обратную совместимость между релизами,такое поведение становится проблемой.
Виртуальное окружение – это инструмент, позволяющий создавать создать локальную папку с набором необходимых версий библиотек необходимых для работы над отдельным проеком.
Разные виртуальные окружния могут иметь разный набор пакетов разных версий. Работая над конкретным проектом, вы просто переключаетесь на подходящее окружение, и проблема уходит. Одно и то же окружение можно использовать сразу в нескольких проектах. Плюс к этому уходит проблема засорения системы пакетами, так как окружения можно легко создавать и удалять. Создавая проекты на желательно используя виртуальные окружения!
Задачи виртуального окружения
При разработке Python-приложений может возникнуть ряд проблем, связанных с использованием библиотек различных версий. Рассмотрим их более подробно:
- различные приложения могут использовать одну и туже библиотеку, но при этом требуемые версии могут отличаться.
- может возникнуть необходимость в том, чтобы запретить вносить изменения в приложение на уровне библиотек, т.е. вы установили приложение и хотите, чтобы оно работало независимо от того обновляются у вас библиотеки или нет. Если приложение будет использовать библиотеки из глобального хранилища, то, со временем, могут возникнуть проблемы.
- у вас просто может не быть доступа к каталогу глобальной базе библиотек.
Для решения данных вопросов используется подход, основанный на построении виртуальных окружений – своего рода песочниц, в рамках которых запускается приложение со своими библиотеками, обновление и изменение которых не затронет другие приложение, использующие те же библиотеки.
Устройство виртуальных окружений
Каждое виртуальное окружение представляет собой директорию. Ее содержимое структурно напоминает общесистемное окружение — поддиректории соответственно названы и наполнены. Давайте рассмотрим пример:
tree env
env
├── bin
│ ├── activate
│ …
│ ├── pip
│ …
│ └── python3 -> …/python3
├── lib
│ └── python3.6
│ └── site-packages
│ ├── pip
│ │ ├── …
│ …
│ └── setuptools-40.6.2.dist-info
│ ├── …
…
В директории виртуального окружения находится директория bin/
, внутри которой расположены:
- Копия интерпретатора под именем
python3
(символическая ссылка на оригинал) - Копия исполняемого файла
pip
В соседней директории по пути lib/python3.6/site-packages
есть библиотеки, уже установленные в окружение. Как правило, только что созданное окружение имеет:
- Установленный пакет pip (исполняемый файл
bin/pip
— его точка входа) - Пакет Setuptools
Эти два пакета составляют необходимый минимум для разработки проекта на Python.
При работе в окружении нужно запускать не системные Python и pip, а исполняемые файлы из директории bin
. Когда интерпретатор Python находится в окружении, он знает, где находятся все доступные пакеты. Интерпретатор находит их по относительному пути ../lib/python3.6
. В таком случае копия pip
из директории bin/
устанавливает пакеты в это же окружение, не затрагивая систему. Получается та самая изоляция, о которой мы говорили в начале урока.
Создание виртуального окружения: документация
Вручную создавать всю описанную иерархию директорий и файлов не нужно — для этого есть специальный модуль venv
.
В macOS и Windows этот модуль входит в поставку Python. На Ubuntu его нужно установить отдельно командой:
К нашей статье в большей мере относятся сторонние пакеты, установленные при помощи pip, обычно располагаются в одном из каталогов, на которую указывает site.getsitepackages:
import site data = site.getsitepackages() print(data)
Покажет путь:
[‘C:\Python’, ‘C:\Python\lib\site-packages’]
Импорт модуля site
добавит специфичные для сайта (программы) пути, к путям поиска модулей и добавляет несколько встроенных имен, если только не был использован параметр командной строки -S
.
Зачем нам все эти детали?
Очень важно иметь представление об этом, так как по умолчанию, каждый объект вашей системы будет использовать одинаковые каталоги для хранения и разрешения пакетов (сторонних библиотек. На первый взгляд это не выглядит чем-то значительным. Это так, но только в отношении системных пакетов, являющихся частью стандартной библиотеки Python – но сторонние пакеты – это другое дело.
Создание виртуального окружения
Вручную создавать всю описанную иерархию директорий и файлов не нужно — для этого есть специальный модуль venv
.
В macOS и Windows этот модуль входит в поставку Python. На Ubuntu его нужно установить отдельно командой:
sudo apt install python3-venv
Проверим, что модуль установился и готов к использованию (ипользуя командную строку):
python -m venv --help
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR ...]
Обычно окружение создается командой python -m venv имя_окружения
. Давайте попробуем создать виртуальное окружение и установить туда пакет cowsay
:
Для создания виртуального окружения, перейдите в директорию своего проекта и выполните:
python -m venv first_venv
Флаг -m
указывает Python-у запустить venv
как исполняемый модуль. first_venv/
— название виртуального окружения (где будут храниться ваши библиотеки).
В результате будет создан каталог first_venv/
содержащий копию интерпретатора Python, стандартную библиотеку и другие вспомогательные файлы.
Новые пакеты будут устанавливаться в venv/lib/python3.x/site-packages/
Активация окружения
При создании окружения в поддиректорию bin
помещается сценарий оболочки, который на macOS и Ubuntu называется activate
, а на Windows — activate.bat
. Чтобы выполнить этот сценарий, нужно вызвать команду:
- на macOS и Ubuntu:
source first_venv/bin/activate
Для активации в Windows, в папке venv\Scripts есть несколько файлов:
- activate.ps1 – для активации через Powershell;
- activate.bat – для активации через CMD.
Для активации просто укажите полный путь до файла. Например: first_venv\Scripts\activate.bat
C:\> first_venv\Scripts\activate.bat
В команде выше обратите внимание, что в Windows поддиректория с исполняемыми файлами называется не bin
, а Scripts
.
После активации отпала необходимость указывать путь до вызываемого исполняемого файла. Теперь cowsay и python вызываются без префикса, но это все те же команды из окружения.
Еще изменилось приглашение оболочки: в нем стало отображаться имя окружения. Это работает на macOS и Ubuntu и всегда напоминает, что мы находимся в виртуальном окружении.
Деактивация окружения делается командой deactivate
, которая становится доступна после активации.
C:\> first_venv\Scripts\deactivate.bat
Активация и деактивация окружения влияют только на текущую сессию — то есть заметны только в этом конкретном терминале. Это удобно, потому что так можно иметь несколько окружений и активировать их одновременно в разных окнах терминала.
О том что вы находитесь в виртуальном окружении свидетельствуют следующие надписи:
Вы так же можете сравнить количество установленных пакетов внутри виртуального окружения с тем, что установлено вне, командой: pip list
Теперь вы можете устанавливать пакеты, которые будут работать только в этой среде.
Для выхода из окружения, за исключением запуска с помощью CMD, используйте команду:
deactivate
Для CMD нужно указать путь до файла “first_ven\Scripts\deactivate.bat”.
Уничтожение виртуального окружения
Вы можете выйти из системы, забыть о Python, вернуться через несколько недель и повторно активировать свое виртуальное окружение. Пакеты по-прежнему будут установлены. Но только в этом виртуальном окружении. Они не будут захламлять вашу системную среду Python или другие виртуальные окружения.
«Мое виртуальное окружение не подлежит ремонту», – скажете вы? Такое случается. Это безопасность использования виртуальных окружений. Что делать?
Сжечь дотла.
rm -r .venv
Всё ушло. Надеюсь, вы помните список пакетов (вы же сначала выполнили pip freeze
или pip list
, чтобы получить список, верно?).
Затем воссоздайте (при необходимости) виртуальное окружение, как описано выше.
Нужная ссылка
Дополнительно:
Проверить версию Питона (в командной строке).
python -V
Как перейти в папку или на другой диск в командной строке
Как открыть командную строку в папке
Как проверить версию Python
Альтернативы venv
На данный момент существует несколько альтернатив для venv:
- pipenv – это pipfile, pip и virtualenv в одном флаконе;
- pyenv – простой контроль версий Питона;
- poetry – новый менеджер для управления зависимостями;
- autoenv – среды на основе каталогов;
- pew – инструмент для управления несколькими виртуальными средами, написанными на чистом Python;
- rez – интегрированная система конфигурирования, сборки и развертывания пакетов для программного обеспечения.