Виртуальные среды в Python
Виртуальные среды Python (venv) позволяют устанавливать пакеты в изолированном от остальной части системы месте. Эта статья является частичным переводом страницы документации.
venv - это модуль Python, который нужно установить отдельно, например в Debian:
Модуль venv поддерживает создание облегченных "виртуальных сред", каждая из которых имеет свой собственный независимый набор пакетов. Виртуальная среда создается поверх существующей установки Python и по-умолчанию изолирована от пакетов в базовой среде, так что доступны только те, которые явно установлены в этой виртуальной среде.
При использовании из виртуальной среды обычные средства установки, такие как pip, будут устанавливать пакеты Python в виртуальную среду без необходимости в явном указании этого.
Виртуальная среда, помимо прочего:
- Используется для размещения определенного интерпретатора Python и программных библиотек и двоичных файлов, необходимых для поддержки проекта (библиотеки или приложения). По-умолчанию они изолированы от программного обеспечения в других виртуальных средах, а также от интерпретаторов и библиотек Python, установленных в операционной системе.
- Содержится в каталоге с условным названием
.venvилиvenvvв каталоге проекта или в каталоге контейнера для множества виртуальных сред, таком как~/.virtualenvs. - Не проверяется в системах управления версиями, таких как
Git. - Считается одноразовым - его должно быть легко удалить и воссоздать заново. Вы не размещаете код проекта в среде.
- Не считается переносимым или копируемым - вы просто воссоздаете ту же среду в целевом местоположении.
Создание виртуальных сред
Виртуальные среды создаются путем выполнения модуля venv:
При этом создается целевой каталог (включая родительские каталоги по мере необходимости) и помещается в него файл pyvenv.cfg с ключом home, указывающим на установку Python, из которой была запущена команда. Он также создает подкаталог bin (или Scripts в Windows), содержащий копию или символическую ссылку на исполняемый файл Python (в зависимости от платформы или аргументов, используемых при создании среды). Он также создает подкаталог lib/pythonX.Y/site-packages (в Windows это Lib\site-packages). Если указан существующий каталог, он будет использован повторно.
Изменения в версии 3.5: Теперь рекомендуется использовать команду
venvдля создания виртуальных сред.
Аргументы командной строки
ENV_DIR: Обязательный аргумент, указывающий каталог, в котором будет создана среда.--system-site-packages: Предоставляет виртуальной среде доступ к системному каталогу пакетов.--symlinks: Использовать символические ссылки, а не копии, если символические ссылки не используются платформой по умолчанию.--copies: Использовать копии, а не символические ссылки, даже если они используются платформой по умолчанию.--clear: Удалить содержимое каталога среды, если он уже существует, перед созданием среды.--upgrade: Обновить каталог среды, чтобы использовать эту версию Python, предполагая, что Python был обновлен на месте.--without-pip: Пропустить установку или обновлениеpipв виртуальной среде (по умолчаниюpipзагружается автоматически).--prompt <PROMPT>: Предоставляет альтернативный префикс запроса для этой среды.--upgrade-deps: Обновить основные зависимости (pip) в PyPI до последней версии.--without-scm-ignore-files: Пропустить добавление файлов SCM в каталог среды (по умолчанию поддерживаетсяGit).
Созданный файл pyvenv.cfg также содержит ключ include-system-site-packages, значение которого равно true, если venv запускается с параметром --system-site-packages, в противном случае - false.
Если не задана опция --without-pip, для загрузки pip в виртуальную среду будет вызван ensurepip.
Для venv может быть задано несколько путей, и в этом случае будет создана идентичная виртуальная среда в соответствии с заданными параметрами по каждому указанному пути.
Как работают venvs
Когда интерпретатор Python запускается из виртуальной среды, параметры sys.prefix и sys.exec_prefix указывают на каталоги виртуальной среды, тогда как sys.base_prefix и sys.base_exec_prefix указывают на каталоги базового Python, используемого для создания среды. Достаточно проверить sys.prefix != sys.base_prefix, чтобы определить, запущен ли текущий интерпретатор из виртуальной среды.
Виртуальная среда может быть "активирована" с помощью скрипта в ее двоичном каталоге (bin в POSIX; Scripts в Windows). Это добавит каталог к вашему пути, так что при запуске python будет вызван интерпретатор Python среды, и вы сможете запускать установленные скрипты без необходимости использовать их полный путь. Вызов сценария активации зависит от платформы (<venv> должен быть заменен путем к каталогу, содержащему виртуальную среду).:
| Платформа | Оболочка | Команда активации |
|---|---|---|
| POSIX | bash/zsh | source |
| POSIX | fish | source |
| POSIX | csh/tcsh | source |
| POSIX | pwsh | source |
| Windows | cmd.exe | |
| Windows | PowerShell |
Вам не нужно специально активировать виртуальную среду, так как вы можете просто указать полный путь к интерпретатору Python этой среды при вызове Python. Кроме того, все скрипты, установленные в среде, должны быть доступны для запуска без ее активации.
Для достижения этой цели скрипты, устанавливаемые в виртуальные среды, содержат строку shebang, которая указывает на интерпретатор Python среды, #!/<path-to-venv>/bin/python. Это означает, что скрипт будет выполняться с этим интерпретатором независимо от значения PATH. В Windows поддерживается обработка строк shebang, если у вас установлен Python install manager. Таким образом, двойной щелчок по установленному скрипту в окне проводника Windows должен запустить его с правильным интерпретатором без необходимости активации среды или указания пути.
Когда активирована виртуальная среда, переменной среды VIRTUAL_ENV присваивается значение пути к среде. Поскольку явная активация виртуальной среды не требуется для ее использования, нельзя полагаться на VIRTUAL_ENV для определения того, используется ли виртуальная среда.