Два Python-проекта могут требовать разные версии одной библиотеки. Если устанавливать всё в системный Python, обновление для одного проекта способно сломать другой. Виртуальное окружение решает эту проблему: у каждого проекта появляется свой набор пакетов.
Минимальный рабочий цикл состоит из четырёх команд:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install requests
python main.py
На Windows команды отличаются. Ниже разберём оба варианта и проверим, что пакеты действительно устанавливаются в нужное окружение.
Что создаёт venv
venv — модуль из стандартной библиотеки Python. Дополнительно устанавливать его через pip не нужно.
После команды:
python3 -m venv .venv
рядом с кодом появится каталог .venv. Внутри находятся:
- исполняемый файл Python;
- каталог для установленных пакетов;
- программа
pip; - скрипты активации для разных оболочек;
- файл
pyvenv.cfgс настройками окружения.
Это не виртуальная машина и не контейнер. .venv — обычный каталог, связанный с той версией Python, которой его создали.
Название можно выбрать любое, но .venv стало распространённым соглашением. По нему редакторы кода обычно сами находят окружение проекта.
Как создать виртуальное окружение
Откройте терминал в каталоге проекта.
На Linux и macOS:
python3 -m venv .venv
На Windows:
py -m venv .venv
Последний аргумент задаёт каталог окружения. Если назвать его backend-env, все файлы окажутся в backend-env. Для большинства проектов достаточно .venv.
Если команда завершилась без вывода, окружение создано. Проверить каталог можно через файловый менеджер или терминал:
ls -la
На Windows:
Get-ChildItem -Force
Как активировать venv
Активация добавляет каталог окружения в PATH. После этого команда python запускает интерпретатор из .venv, а pip устанавливает пакеты туда же.
Для bash и zsh на Linux или macOS:
source .venv/bin/activate
Для PowerShell:
.\.venv\Scripts\Activate.ps1
Для командной строки Windows:
.venv\Scripts\activate.bat
После активации в начале строки терминала обычно появляется имя окружения:
(.venv) user@computer project %
Надпись удобна, но надёжнее проверить путь к интерпретатору:
python -c "import sys; print(sys.executable)"
В результате должен быть путь с .venv. Например:
/home/user/project/.venv/bin/python
или:
C:\Users\User\project\.venv\Scripts\python.exe
Как установить пакет внутрь окружения
После активации установим библиотеку requests:
python -m pip install requests
Форма python -m pip длиннее обычного pip install, зато явно связывает pip с текущим интерпретатором Python. Это помогает избежать ситуации, когда python взят из окружения, а pip — из системы.
Проверим установку:
python -c "import requests; print(requests.__version__)"
Пакет доступен только внутри этого окружения. После перехода в другой проект его придётся установить в окружение того проекта.
Как сохранить зависимости
Сам каталог .venv не передают другим разработчикам. Вместо него сохраняют список пакетов:
python -m pip freeze > requirements.txt
В файле появятся имена установленных пакетов и их версии. На другом компьютере окружение создают заново, затем устанавливают зависимости из этого списка:
python -m pip install -r requirements.txt
Для небольшого учебного проекта этого достаточно. В большом приложении зависимости обычно ведут через pyproject.toml и фиксируют отдельным lock-файлом, но это уже задача системы сборки, а не venv.
Если хочется управлять окружением, версией Python и lock-файлом одной программой, смотри практическое руководство по uv. Там же разобран безопасный перенос существующего requirements.txt.
Почему .venv не добавляют в Git
Виртуальное окружение может занимать сотни мегабайт и содержать файлы, зависящие от операционной системы и расположения проекта. Перенос готового каталога между компьютерами ненадёжен.
Добавьте окружение в .gitignore:
.venv/
В репозитории должны остаться код проекта и описание зависимостей. Саму .venv всегда можно создать заново.
Не путайте .venv и .env. В .venv лежат Python и пакеты. В .env обычно хранят переменные окружения: токены, адреса сервисов и локальные настройки. Файл .env с секретами тоже не добавляют в Git, но это другой файл с другой задачей.
Как выйти из окружения
Выполните:
deactivate
Команда уберёт .venv из PATH текущего терминала. Каталог и установленные пакеты останутся на месте.
Закрытие терминала тоже завершает активацию. После открытия нового окна окружение нужно активировать снова, но создавать заново не требуется.
Можно ли работать без активации
Да. Активация только сокращает команды. Интерпретатор из окружения можно вызвать напрямую.
На Linux и macOS:
.venv/bin/python main.py
.venv/bin/python -m pip install requests
На Windows:
.\.venv\Scripts\python.exe main.py
.\.venv\Scripts\python.exe -m pip install requests
Этот способ пригодится в скриптах запуска и при ограничениях PowerShell: он не меняет настройки оболочки и не требует запуска Activate.ps1.
Почему пакет не импортируется
Чаще всего пакет установили не тем интерпретатором. Сначала проверьте путь:
python -c "import sys; print(sys.executable)"
Затем проверьте, где pip видит пакеты:
python -m pip --version
Если pip install requests введён после приглашения >>>, Python ответит SyntaxError: invalid syntax: это команда терминала, а не Python-код. Как выйти в нужный терминал и прочитать остальные части сообщения, разобрано в статье про SyntaxError.
Оба пути должны содержать .venv. Если один из них ведёт в системный каталог, активируйте окружение заново или вызывайте .venv/bin/python напрямую.
В редакторе кода тоже нужно выбрать интерпретатор из .venv. Активация в отдельном терминале не всегда меняет настройки уже открытого редактора.
Когда окружение нужно пересоздать
Пересоздайте .venv, если:
- проект переместили в другой каталог;
- обновили основную версию Python;
- окружение скопировали с другого компьютера;
- зависимости накопились и непонятно, какие из них нужны проекту.
Удалите каталог .venv, создайте его той версией Python, на которой должен работать проект, и установите зависимости из requirements.txt.
Окружение намеренно устроено как расходный материал. Код и список зависимостей важны, а .venv всегда восстанавливается из них.
Следующий практический шаг — запустить проект со сторонней библиотекой. В инструкции по Telegram-боту окружение отделит зависимости бота от остальных Python-проектов на компьютере.