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

При установки библиотек, по умолчанию 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 – интегрированная система конфигурирования, сборки и развертывания пакетов для программного обеспечения.

https://www.youtube.com/watch?v=h5nrwaIVIhU