Перейти к содержанию

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

Виртуальные среды Python (venv) позволяют устанавливать пакеты в изолированном от остальной части системы месте. Эта статья является частичным переводом страницы документации.

venv - это модуль Python, который нужно установить отдельно, например в Debian:

apt install python3.13-venv

Модуль venv поддерживает создание облегченных "виртуальных сред", каждая из которых имеет свой собственный независимый набор пакетов. Виртуальная среда создается поверх существующей установки Python и по-умолчанию изолирована от пакетов в базовой среде, так что доступны только те, которые явно установлены в этой виртуальной среде.

При использовании из виртуальной среды обычные средства установки, такие как pip, будут устанавливать пакеты Python в виртуальную среду без необходимости в явном указании этого.

Виртуальная среда, помимо прочего:

  • Используется для размещения определенного интерпретатора Python и программных библиотек и двоичных файлов, необходимых для поддержки проекта (библиотеки или приложения). По-умолчанию они изолированы от программного обеспечения в других виртуальных средах, а также от интерпретаторов и библиотек Python, установленных в операционной системе.
  • Содержится в каталоге с условным названием .venv или venvv в каталоге проекта или в каталоге контейнера для множества виртуальных сред, таком как ~/.virtualenvs.
  • Не проверяется в системах управления версиями, таких как Git.
  • Считается одноразовым - его должно быть легко удалить и воссоздать заново. Вы не размещаете код проекта в среде.
  • Не считается переносимым или копируемым - вы просто воссоздаете ту же среду в целевом местоположении.

Создание виртуальных сред

Виртуальные среды создаются путем выполнения модуля venv:

python -m venv /path/to/new/virtual/environment

При этом создается целевой каталог (включая родительские каталоги по мере необходимости) и помещается в него файл 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 /bin/activate
POSIX fish source /bin/activate.fish
POSIX csh/tcsh source /bin/activate.csh
POSIX pwsh source /bin/Activate.ps1
Windows cmd.exe \Scripts\activate.bat
Windows PowerShell \Scripts\Activate.ps1

Вам не нужно специально активировать виртуальную среду, так как вы можете просто указать полный путь к интерпретатору Python этой среды при вызове Python. Кроме того, все скрипты, установленные в среде, должны быть доступны для запуска без ее активации.

Для достижения этой цели скрипты, устанавливаемые в виртуальные среды, содержат строку shebang, которая указывает на интерпретатор Python среды, #!/<path-to-venv>/bin/python. Это означает, что скрипт будет выполняться с этим интерпретатором независимо от значения PATH. В Windows поддерживается обработка строк shebang, если у вас установлен Python install manager. Таким образом, двойной щелчок по установленному скрипту в окне проводника Windows должен запустить его с правильным интерпретатором без необходимости активации среды или указания пути.

Когда активирована виртуальная среда, переменной среды VIRTUAL_ENV присваивается значение пути к среде. Поскольку явная активация виртуальной среды не требуется для ее использования, нельзя полагаться на VIRTUAL_ENV для определения того, используется ли виртуальная среда.