Python venv: что такое виртуальное окружение и как им пользоваться
Учимся изолировать код от внешнего мира и предотвращать хаос в зависимостях.
 
 
Виртуальное окружение (venv, virtual environment) в Python — это изолированное рабочее пространство для проектов. Представьте, что ваш компьютер — дом со множеством комнат. Виртуальное окружение в этом случае — отдельная комната с инструментами, мебелью и всем необходимым для работы над конкретным проектом. Вы можете создать сколько угодно таких комнат, и каждая будет существовать независимо от других. Благодаря этому вы сможете переключаться между проектами, не смешивая их содержимое.
Мы упомянули понятие «виртуальное окружение» вместе с терминами virtual environment и venv, которые часто используются как синонимы. Однако между ними есть разница: virtual environment — это общий термин, обозначающий концепцию изолированной среды в Python, а venv — конкретный модуль в стандартной библиотеке Python для создания виртуальных окружений. В статье мы создадим виртуальное окружение с помощью venv, активируем его и потренируемся им пользоваться.
Содержание
Подготовительная часть
Начать работу с виртуальным окружением несложно. Однако прежде вам нужно установить Python и редактор кода, а также освоить базовые навыки работы с командной строкой. Если всё это у вас уже есть, можете сразу переходить к следующему разделу.
«Как запустить Python офлайн и онлайн: руководство для новичка» — статья, в которой мы рассматриваем системные требования, помогаем с выбором версии языка и предлагаем пошаговые инструкции по установке Python на Windows, Linux и macOS.
После установки Python откройте терминал и введите следующую команду. Она должна вывести номер установленной версии:
python --version
Если вы установили Python по нашему руководству, то уже познакомились с основными командами терминала. В дальнейшем мы будем использовать такие же простые команды, поэтому специально изучать работу с терминалом не обязательно. Однако, если хотите углубиться в тему, рекомендуем ознакомиться со статьёй «Основные команды и горячие клавиши терминала Linux (а также Unix, macOS и FreeBSD)».
«Visual Studio Code: установка, настройка, русификация и список горячих клавиш» — подробное руководство по настройке бесплатного редактора VS Code. Рекомендуем также установить расширение Python для VS Code, которое включает функции отладки, автодополнения кода, форматирования и интеграции с виртуальными окружениями.
Вот несколько задач, для которых может пригодиться виртуальное окружение.
- Разработка нескольких проектов с разными зависимостями. Например, один проект может требовать Python 3.7 и Django 2.2, а другой — Python 3.9 и Django 3.2. Виртуальные окружения позволяют легко переключаться между обоими проектами на одном компьютере, избегая конфликтов между версиями.
- Изоляция проекта от системных библиотек. Предположим, на вашем компьютере установлена версия NumPy 1.18, а проекту требуется версия 1.20. Виртуальное окружение позволяет установить и использовать нужную версию библиотеки для конкретного проекта, не затрагивая системные установки.
- Обучение и экспериментирование. Виртуальные окружения служат безопасной площадкой для изучения новых библиотек и версий Python. Они позволяют тестировать инструменты без риска нарушить работу существующих проектов.
- Упрощение развёртывания проектов на разных машинах. Виртуальное окружение облегчает передачу проекта другим разработчикам или клиентам. Достаточно отправить коллеге файл со списком всех зависимостей проекта и их версий, и он сможет воссоздать копию вашей рабочей среды на своём компьютере.
Как создать виртуальное окружение: create venv python
Для создания виртуального окружения в Python откройте терминал, перейдите в директорию проекта и выполните команду:
python -m venv my_project_environment
В этой команде my_project_environment — это название виртуального окружения. Хотя оно может быть любым, старайтесь выбирать имя, которое отражает суть проекта. Лучше использовать длинное и понятное название, чем короткую аббревиатуру.
Перейдём к практике и разберём сценарий, когда на одном компьютере нам нужно создавать два проекта: первый — на Django 2.2, а второй — на Django 3.2.
Давайте последовательно выполним две команды, чтобы создать виртуальные окружения для каждого из наших проектов:
# Создание виртуального окружения для проекта с Django 2.2
python -m venv django_2_2_env
# Создание виртуального окружения для проекта с Django 3.2
python -m venv django_3_2_envПосле выполнения команд в терминале не произойдёт видимых изменений. Однако в фоновом режиме Python создаст изолированную среду, скопирует нужные файлы и настроит пути для работы с пакетами.

Скриншот: Командная строка Windows / Skillbox Media
Как активировать виртуальное окружение: activate venv python
После создания виртуального окружения останьтесь в директории проекта и выполните команду активации:
- для Windows: myenv\\Scripts\\activate;
- для macOS и Linux: source myenv/bin/activate.
После активации все команды языка Python и менеджера пакетов PIP будут работать с версиями и пакетами, установленными в этом окружении.
Мы создали два виртуальных окружения, но активировать можно только одно за раз. Давайте активируем окружение django_2_2_env в Windows:
django_2_2_env\Scripts\activate

Скриншот: Командная строка Windows / Skillbox Media
Теперь перейдём в VS Code и убедимся, что виртуальное окружение активировано и мы можем начать работу над нашим проектом:
- введите в терминале команду code . для запуска VS Code;
- в VS Code откройте новый терминал через меню View → Terminal;
- убедитесь, что в терминале VS Code отображается название вашего виртуального окружения. В нашем случае это django_2_2_env.
Если всё прошло успешно ?, вы можете сразу приступить к работе. Если нет — изучите сообщения в терминале и определите, что именно нужно исправить. Например, мы столкнулись с проблемой активации виртуального окружения через команду терминала из-за политики выполнения PowerShell. Это распространённая ситуация в Windows.

Скриншот: Visual Studio Code / Skillbox Media
Если столкнётесь с такой же проблемой, откройте PowerShell от имени администратора и выполните следующую команду:
Set-ExecutionPolicy RemoteSigned
После этого появится запрос на подтверждение изменения политики выполнения скриптов. Введите Y, нажмите Enter и попробуйте снова активировать виртуальное окружение.
Если предыдущий метод не сработал, попробуйте альтернативный способ активации виртуального окружения. Эта команда напрямую запускает скрипт активации, обходя некоторые ограничения безопасности:
path\to\venv\Scripts\activate.bat
path\to\venv\ — это путь к вашему виртуальному окружению. В нашем примере команда будет выглядеть так:
django_2_2_env\Scripts\activate.bat
В процессе работы вы неизбежно столкнётесь со множеством подобных ошибок, которые невозможно предвидеть и предотвратить. Поэтому вам, как разработчику, необходимо научиться копировать текст ошибок и самостоятельно искать решения в интернете.

Читайте также:
Мы устранили ошибку, активировали виртуальное окружение и теперь можем приступить к работе над проектом. Давайте установим Django 2.2:
pip install django==2.2Убедимся, что нужная версия Django установлена:
python -m django --version
Также проверим местоположение нашего виртуального окружения:
pip -V

Скриншот: Visual Studio Code / Skillbox Media
После активации виртуального окружения Python создаёт структуру файлов и папок, обеспечивающую изоляцию проекта и управление зависимостями. Эта структура включает в себя папки Include, Lib и Scripts, а также файл pyvenv.cfg:

Скриншот: Visual Studio Code / Skillbox Media
Папка Include содержит специальные файлы, необходимые для компиляции некоторых Python-пакетов. Например, при установке библиотеки NumPy, которая включает части кода на языке C, система использует файлы из этой папки для компиляции и установки пакета в вашем виртуальном окружении. Изначально эта папка пуста, а необходимые файлы создаются по мере установки определённых пакетов.
Папка Lib содержит все установленные библиотеки и пакеты для данного окружения. Например, если вы установили в виртуальное окружение Django 3.2, в папке Lib/site-packages будет храниться директория django со всеми файлами этого фреймворка.
Папка Scripts содержит исполняемые файлы и скрипты для работы с окружением. Вот её основное содержимое:
- activate и activate.bat — скрипты для активации виртуального окружения;
- deactivate.bat — скрипт для деактивации окружения;
- python.exe — исполняемый файл Python для данного окружения;
- pip.exe — утилита для установки пакетов и управления ими.
Pyvenv.cfg — это конфигурационный файл, обеспечивающий корректную работу виртуального окружения. Он указывает системе, какую версию Python и какие настройки применить при активации окружения.
Как выйти из виртуального окружения: deactivate venv python
Допустим, мы хотим выйти из виртуального окружения в основное пространство системы. Для этого достаточно выполнить простую команду:
deactivate
После этого введите pip -V и убедитесь, что вы больше не находитесь в виртуальном окружении. Если деактивация не произошла, перезапустите VS Code и повторите процесс. Вот несколько дополнительных советов:
- python -m venv --help — используйте эту команду для просмотра всех доступных опций при создании виртуального окружения и работе с ним.
- Virtualenvwrapper — попробуйте этот инструмент, если вам часто приходится создавать несколько виртуальных окружений и переключаться между ними. Он удобнее стандартного venv, поскольку предоставляет простые команды для управления виртуальными окружениями и хранит все окружения в одном месте.
- pip install --upgrade [имя_пакета] — применяйте эту команду примерно раз в месяц или при выходе важных обновлений безопасности. Это поможет поддерживать актуальность пакетов в вашем виртуальном окружении.
Теперь активируем второе виртуальное окружение django_3_2_env:
django_3_2_env\Scripts\activate.bat
Предположим, во время активации мы столкнулись с какой-то новой ошибкой и не смогли её исправить. В таком случае нам нужно удалить это окружение, чтобы создать его заново:
- в Windows: rmdir /s /q имя_окружения;
- в macOS и Linux: rm -rf имя_окружения.
имя_окружения — название окружения, которое вы деактивировали и хотите удалить.
Теперь применим новую команду и попробуем удалить второе окружение:
rmdir /s django_3_2_env
Эта команда должна полностью удалить директорию виртуального окружения, однако иногда она не срабатывает и выдаёт такую ошибку:
+ CategoryInfo : InvalidArgument: (:) [Remove-Item], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand
Эта ошибка часто возникает из-за особенностей работы PowerShell в Windows, связанных с ограничениями доступа или блокировкой файлов системой. Для её устранения воспользуйтесь альтернативной командой:
Remove-Item -Recurse -Force django_3_2_envЕсли альтернативная команда не сработала, закройте все программы и процессы, которые могут использовать файлы в этой директории. Затем перезапустите редактор кода и попробуйте снова удалить окружение. Такова она, жизнь программиста ¯\(ツ)/¯

Скриншот: Visual Studio Code / Skillbox Media
Альтернативные виртуальные окружения
Помимо venv, есть и другие инструменты для создания изолированных сред в Python, которые лучше подходят для определённых задач. Рассмотрим некоторые из них:
- Virtualenv поддерживает старые версии Python и предоставляет больше функций, чем venv. Например, Virtualenv позволяет указать конкретную директорию для установки пакетов, в то время как venv использует фиксированный подкаталог. Такая гибкость делает Virtualenv удобным для сложных проектов.
- Conda управляет пакетами Python и системными зависимостями, что делает его подходящим для сложных проектов в data science и машинном обучении. Например, одной командой Conda может создать окружение с Python 3.8, TensorFlow 2.4.0 и OpenCV. В сравнении с Conda у venv более ограниченная функциональность: он создаёт окружения только для Python и его пакетов, не управляет системными зависимостями и работает с уже установленной версией Python.
- Pipenv объединяет управление зависимостями и виртуальными окружениями в одном инструменте — воспроизводимой среде разработки. У venv более узкая функциональность: он не управляет зависимостями автоматически и не предоставляет инструментов для разделения сред разработки и продакшена.
- Poetry управляет зависимостями, сборкой и публикацией пакетов в Python. Его часто применяют в проектах, требующих точного контроля версий. Poetry позволяет указывать конкретные версии пакетов, чтобы обеспечить единую среду разработки для всех участников проекта и избежать ошибок из-за разных версий проекта.
Выбор инструмента зависит от специфики проекта, личных предпочтений и требований команды. Например, специалист по data science может предпочесть Conda вместо venv для работы с большими объёмами данных и выполнения сложных вычислений.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!
Python для всех
Вы освоите Python на практике и создадите проекты для портфолио — телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер — руководитель отдела разработки в «Сбере».
Пройти бесплатно 
          Все
                                Все
                             Истории
                                        Истории Дизайн
                                    Дизайн Код
                                    Код Геймдев
                                    Геймдев Бизнес
                                    Бизнес Маркетинг
                                    Маркетинг Управление
                                    Управление Кино
                                    Кино Музыка
                                    Музыка Проектная фотография
                                    Проектная фотография Развитие
                                    Развитие Здоровье
                                    Здоровье Деньги
                                    Деньги Образование
                                    Образование EdTech
                                    EdTech Корп. обучение
                                    Корп. обучение Блог Skillbox
                                    Блог Skillbox Глоссарий
                                        Глоссарий Спецпроекты
                                        Спецпроекты Профориентация
                                        Профориентация 
                                    
 
     
                                     
                                     
                                     
                                    