Управление виртуальными окружениями в Python (venv)
Виртуальные окружения в Python позволяют изолировать зависимости проектов, предотвращая конфликты версий пакетов. Модуль venv, входящий в стандартную библиотеку начиная с Python 3.3, предоставляет все необходимые инструменты для создания и управления такими окружениями. В этой части рассматриваются основные команды, альтернативные способы настройки и типичные затруднения.
Как создать и активировать виртуальное окружение с помощью venv?
Стандартный и наиболее часто используемый способ - вызов модуля venv с указанием имени каталога будущего окружения:
python -m venv myenvPython venv ubuntu (создать виртуальное окружение python в ubuntu)
После этого в текущей папке появляется каталог myenv со структурой, включающей интерпретатор pip и копию стандартной библиотеки. Для начала работы окружение необходимо активировать. На разных операционных системах команды различаются:
- Windows (командная строка cmd):
myenv\Scripts\activatePython activate window (активация виртуального окружения python в windows)
- Windows (PowerShell):
myenv\Scripts\Activate.ps1Python venv exit (выход из виртуального окружения python)
- Linux / macOS (bash, zsh):
source myenv/bin/activateVenv python version (версия python в виртуальном окружении)
При успешной активации в командной строке появляется префикс в виде названия окружения в скобках. Для деактивации используется команда deactivate.
Типичные ошибки и их решение:
- Ошибка «Python не является внутренней или внешней командой» - Python не добавлен в PATH. Следует установить галочку «Add Python to PATH» при установке или указать полный путь к интерпретатору.
- Ошибка «ModuleNotFoundError: No module named 'venv'» - в некоторых минимальных установках Linux пакет python3-venv отсутствует. Необходимо установить его через менеджер пакетов (например,
sudo apt install python3-venv). - На PowerShell не удаётся выполнить скрипт из-за политики исполнения - запустить PowerShell от имени администратора и выполнить
Set-ExecutionPolicy RemoteSigned.
Как создать виртуальное окружение для конкретной версии Python?
Если в системе установлено несколько интерпретаторов (например, Python 3.8 и Python 3.10), можно явно указать нужный:
python3.10 -m venv myenv_py310Python venv commands (команды виртуального окружения python)
Либо используя полный путь к интерпретатору:
C:\Python310\python.exe -m venv myenv_py310Python django venv (настройка виртуального окружения для django)
Это позволяет создавать окружения, привязанные к определённой мажорной или минорной версии Python.
Проблема: После создания окружения в нём может оказаться не та версия. Стоит проверить командой python --version внутри активированного окружения.
Как включить доступ к глобально установленным пакетам?
По умолчанию venv создаёт полностью изолированную среду. Флаг --system-site-packages разрешает видеть системные пакеты внутри окружения:
python -m venv --system-site-packages myenvPython venv linux (использование виртуального окружения на linux)
Это удобно, когда окружение не должно дублировать уже установленные глобально библиотеки, но при этом позволяет устанавливать свои зависимости. Следует учитывать, что при таком подходе возможны конфликты версий.
Риск: Если в системе пакет обновится, это может сломать работу проекта внутри окружения. Рекомендуется использовать полную изоляцию, если проект требует строгой воспроизводимости.
Как создать окружение без pip и установить его позже?
Иногда требуется создать окружение без предустановленного pip - например, для использования альтернативных менеджеров (conda). Для этого используется флаг --without-pip:
python -m venv --without-pip myenvPython unable to create venv (ошибка создания виртуального окружения python)
После активации такого окружения pip в нём отсутствует. Его можно установить вручную командой:
python -m ensurepip --upgradeVenv bin python (путь к интерпретатору в виртуальном окружении)
Или загрузить get-pip.py и выполнить его.
Почему это нужно? Некоторые образы Docker или CI-окружения могут быть настроены на собственную процедуру установки pip. Также это позволяет контролировать версию устанавливаемого pip.
Как воспроизвести окружение на другой машине?
После активации исходного окружения создаётся файл со списком установленных пакетов и их версий:
pip freeze > requirements.txtVenv python 3 (создание виртуального окружения с python 3)
На целевой машине создаётся новое виртуальное окружение, активируется, и пакеты устанавливаются из этого файла:
pip install -r requirements.txtPython venv install packages (установка пакетов в виртуальное окружение python)
Это стандартный способ переноса зависимостей. Однако pip freeze не фиксирует все подзависимости, если они не были явно запрошены. Для полной воспроизводимости рекомендуется указывать точные версии пакетов.
Ошибка: Если на целевой системе отличается версия Python, часть пакетов может оказаться несовместимой. Следует убедиться, что интерпретаторы совпадают.
Как удалить виртуальное окружение?
Достаточно деактивировать текущее окружение и удалить его каталог:
deactivate
rm -rf myenv # на Linux/macOS
rmdir /s myenv # на Windows
Никаких дополнительных действий не требуется.
Ниже приведены более детальные примеры использования venv, которые помогут в нестандартных ситуациях.
Расширенные примеры команд
Создание окружения с очисткой предыдущей версии
Флаг --clear удаляет существующее окружение перед созданием заново, сохраняя имя каталога:
python -m venv --clear myenv
Полезно при перестроении окружения без лишних действий.
Принудительное использование копий вместо ссылок (Windows)
На Windows venv по умолчанию использует копии файлов. Флаг --symlinks (или --copies) не имеет эффекта на Windows, но на Linux/macOS можно явно указать:
python -m venv --symlinks myenv # использовать символьные ссылки (по умолчанию)
python -m venv --copies myenv # копировать файлы вместо ссылок
Копии занимают больше места, но не зависят от изменений в исходном интерпретаторе.
Установка пакетов с игнорированием зависимостей
Иногда требуется установить только указанные пакеты без их подзависимостей, чтобы избежать конфликтов:
pip install --no-deps requests==2.28.1
Это может привести к неработоспособности пакета, но иногда используется для минимизации состава окружения.
Экспорт списка пакетов с хэшами (для верификации)
Команда pip freeze --all выводит не только пакеты, установленные явно, но и все зависимости с контрольными суммами:
pip freeze --all > requirements-hashed.txt
Пример содержимого:
certifi==2023.7.22 --hash=sha256:... charset-normalizer==3.2.0 --hash=sha256:... ...
При повторной установке pip проверит хэши, что гарантирует целостность пакетов.
Проверка целостности установленных пакетов
Команда pip check анализирует зависимости на предмет конфликтов:
pip check
No broken requirements found.
Если обнаружены несоответствия, выводится информация о конфликтующих пакетах.
Обновление pip внутри окружения
Старые версии pip могут работать медленно. Рекомендуется обновить его сразу после активации:
pip install --upgrade pip
Если в окружении не хватает прав (особенно в Linux), добавляется флаг --user:
pip install --upgrade --user pip
Но в изолированном окружении это редко требуется.
Отображение списка пакетов в удобном формате
Команда pip list поддерживает несколько форматов вывода. Например, в виде таблицы:
pip list --format=columns
Package Version ---------- ------- pip 23.2.1 setuptools 68.0.0
Или в формате, пригодном для автоматической обработки (json):
pip list --format=json
[{"name": "pip", "version": "23.2.1"}, ...]
Различия в активации между оболочками
Для оболочки fish активация выглядит иначе:
source myenv/bin/activate.fish
А для csh/tcsh:
source myenv/bin/activate.csh
Важно выбрать правильный скрипт, иначе переменные окружения не будут установлены.
Проблема длинных путей на Windows
Если путь к каталогу окружения превышает 260 символов, активация может завершиться ошибкой. Решение - создать окружение в корне диска или использовать короткие имена:
python -m venv C:\venvs\projA
Также можно включить поддержку длинных путей через групповые политики Windows.
Установка пакетов прямо из репозитория GitHub
Виртуальное окружение позволяет устанавливать пакеты напрямую из VCS:
pip install git+https://github.com/psf/requests.git@main
Это удобно для тестирования последних изменений.