Python: Виртуальные среды — это просто
Виртуальные среды / Virtual Environments
Виртуальная среда помогает решать конфликты зависимостей проекта, создавая изолированные среды. Эти изолированные среды
содержат все полезные вещи, которые могут понадобиться Python программистам для разработки своих проектов.
Виртуальные среды включают новую копию двоичных файлов Python и автономную копию всей стандартной библиотеки Python. Поэтому она может работать сама по себе.
Использование виртуальной среды даёт следующие преимущества:
- мы можем сохранять наши локальные пакеты нетронутыми;
- мы можем поделиться зависимостями с другими разработчиками с помощью файла
requirements.txt; - мы можем развернуть приложение Python на выделенном сервере (PythonAnyWhere, Heroku и т. д.)
Потребность в виртуальных средах
Я использую много библиотек для своих проектов. Среди них три фреймворка для разработки веб-приложений, а также есть другие библиотеки, которые я хотел бы изучать в будущем. Это служит основным аргументом в пользу того, что серьёзные проекты на Python зависят от других пакетов, написанных другими разработчиками.
Если вы Django разработчик, я уверен, что вы используете фреймворк Django rest для создания мощных rest API, Django Debug Toolbar для сбора различной отладочной информации о текущем запросе/ответе, Celery для заботы об операциях в реальном времени и расписании, и так далее.
Например, я в значительной степени полагаюсь на пакет request для некоторых своих проектов, а веб-приложение Django, над которым я сейчас работаю, зависит от версии 2.3.0. Согласно официальной документации, на момент написания статьи, последней версией пакета является 3.2
Предположим, я установил последнюю версию библиотеки на свой компьютер с Ubuntu, потому что она мне нужна для другого проекта. Кажется, всё нормально работает, пока я не попытаюсь использовать старый проект, который отлично работал с 2.3.0. Внезапно всё ломается.
Что случилось? Может быть, API последней версии Django изменился с версии 2.3.0? На данный момент причина не имеет значения, так как мой старый проект сломан и больше не работает.
Возник конфликт между двумя проектами. Они используют одну и ту же библиотеку, но требуют разные версии.
Различные пакеты решают эту проблему. Давайте посмотрим некоторые, выделяющиеся.
Прежде чем начать
В этом руководстве мы будем использовать Python 3, поэтому давайте начнём с проверки установки.
Для этого откройте терминал — cmd/PowerShell в Windows — и введите следующую команду.
python --version
Python 3.9.5 # Мой результатПримечание. В большинстве систем macOS и Linux Python установлен. Если вы используете Windows, вы можете прочитать руководство по установке Python.
Если полученный вами результат не соответствует виду Python 3.х, есть два варианта:
- Если эта команда вернула версию Python 2.х, вам нужно использовать Python 3.х вместе с этим руководством.
- Если вы получили ошибку
Неизвестная команда, попробуйте запуститьpython3, и если вы снова получили ошибку, следуйте руководству по установке Python
Вы можете проверить существование двоичного файла python3, проверив его версию:
python3 --version
Python 3.9.5Примечание: если приведённая выше команда сработала, вам нужно будет запускать python3 вместо python.
Теперь, когда вы знаете, какая команда Python выполняется на вашем компьютере, давайте перейдём к виртуальным средам.
Встроенный модуль venv
Давайте воспользуемся встроенным Python модулем venv для создания виртуальной среды.
Примечание: для использования этого модуля у вас должен быть установлен Python 3.3 или выше.
Для создания виртуальной среды Python с помощью venv, выполните следующую команду:
python -m venv virt1Примечание: флаг - m означает, что Python запускает встроенный модуль venv как скрипт.
Это создаст виртуальную среду с именем virt1, но это всего лишь аргумент. Вы можете создать виртуальную среду с любым именем.
Всё, что установлено в каталоге virt1, не повлияет на глобальные пакеты или общесистемные установки, что позволяет избежать конфликтов зависимостей.
Активация виртуальных сред
Важно знать, что каждый раз, когда мы хотим использовать созданную виртуальную среду, нужно активировать её с помощью команды:
source virt1/bin/activateОна будет работать не в каждой системе. Вы можете посмотреть таблицу команд для разных платформ, чтобы иметь чёткое представление, какую команду использовать:
| Платформа | shell | Команда активации виртуальной среды |
|---|---|---|
| POSIX | bash/zsh | source (venv-name)/bin/activate |
| fish | source (venv-name)/bin/activate.fish | |
| csh/tcsh | source (venv-name)/bin/activate.csh | |
| PowerShell Core | (venv-name)/bin/Activate.ps1 | |
| Windows | cmd.exe | <venv>\Scripts\activate.bat |
| PowerShell | <venv>\Scripts\Activate.ps1 |
Как вы могли заметить я использую bash в POSIX (macOS и Linux), поэтому запускаю приведённую выше команду.
После создания виртуальной среды
После активации виртуальной среды приглашение терминала немного изменится.

Следующая команда деактивирует виртуальную среду:
deactivateОбратите внимание, как снова изменилось приглашение терминала.

Теперь снова активируем виртуальную среду и используем команду which для проверки используемого бинарного файла Python:
source virt1/bin/activate
which pythonЕсли всё работает хорошо, вы должны получить что-то вроде:
/home/daniel/tests/python-tests/venvs/virt1/bin/pythonЕсли вы используете deactivate и ещё раз введёте which, вы должны получить другой результат:
deactivate
/usr/bin/pythonЭто связано с тем, что при работе в виртуальной среде используется двоичная копия, размещённая внутри этой среды. То же самое относится и к пакетам.
pip с виртуальными средами
Хотя это не руководство по pip, важно продемонстрировать рабочий процесс между pip и виртуальными средами.
pip — сокращение Pip Installs Packages
— менеджер пакетов, используемый для установки и управления пакетами Python.
Это чрезвычайно полезно, когда вы хотите распространять свой проект, поскольку позволяет другим разработчикам и конечным пользователям сразу устанавливать все зависимости вашего проекта.
Например, коллега-разработчик может активировать виртуальную среду, а затем выполнить следующую команду для установки зависимостей проекта:
pip install -r requirements.txtrequirements.txt — файл, содержащий все зависимости проекта, конкретные версии пакетов.
Для генерации файла зависимостей вашего проекта, вы можете выполнить следующую команду:
pip freeze > requirements.txtЕсли вы хотите установить определённую версию пакета, вы можете запустить pip install, за которым следует имя пакета, двойной знак равенства (==) и версия пакета:
pip install package==versionМы также можем удалить пакет с нашей машины или виртуальной среды:
pip uninstall some-package-nameVirtualenv
Virtualenv — внешний пакет, используемый для создания виртуальных сред. На самом деле встроенный в Python venv является его подмножеством, поэтому у virtualenv больше возможностей. Узнать больше о преимуществах virtualenv перед venv можно в официальной документации.
Давайте установим virtualenv с помощью pip (убедитесь, что вы деактивировали предыдущий venv) выполнив следующую команду:
pip install virtualenvПримечание: Под Windows рекомендуется устанавливать и использовать как модуль Python python -m pip install --user virtualenv, и python -m virtualenv --help соответственно. Или установить pipx — утилиту устанавливающую и запускающую приложения Python в изолированной среде, и через неё установить virtualenv — pipx install virtualenv, тогда virtualenv можно будет использовать как отдельное приложение, а не модуль Python.
Этот инструмент работает аналогичное venv, поэтому давайте проверим его, создав другую виртуальную среду:
virtualenv virt2Примечание: убедитесь, что вы деактивировали другую виртуальную среду перед выполнением вышеуказанной команды.
Как и в случае с venv, мы должны активировать виртуальную среду перед её использованием:
source virt2/bin/activateи под Windows для PowerShell
.\virt2\Scripts\activate.ps1Если я сейчас установлю самую новую версию модуля requests, он будет установлен только в виртуальной среде virt2:
pip install requestsПриведённая выше команда выведет следующее в консоль:
Collecting requests
...
Installing collected packages: urllib3, idna, chardet, certifi, requests
Successfully installed certifi-2021.5.30 chardet-4.0.0 idna-2.10 requests-2.25.1 urllib3-1.26.5Команда pip freeze выведет список всех установленных пакетов:
certifi==2021.5.30
chardet==4.0.0
idna==2.10
requests==2.25.1
urllib3==1.26.5Как видите, единственные пакеты, которые получаем в списке — это последняя версия (на момент написания статьи) requests и её зависимости.
Другие возможности virtualenv
Используя флаг -p при работе с virtualenv для задания определённо версии Python из установленных на машине.
Например, следующую команду можно использовать для создания виртуальной среды virt2 c Python3, если на компьютере установлен Python3:
virtualenv -p /usr/bin/python3 virt2Для удаления виртуальной среды используйте обычную команду удаления каталога для вашей операционной системы. Например, для Linux rm -r:
rm -r virt2Вы можете узнать больше о расширенном использовании интерфейса командной строки virtualenv из официальной документации.
Virtualenvwrapper
virtualenvwrapper предоставляет команды ещё больше упрощающие работу с виртуальными средами, организуя их все в одном месте.
virtualenvwrapper устанавливается с помощью команды pip, но у вас должны быть права администратора.
pip install virtualenvwrapperили
sudo pip install virtualenvwrapperЭто создаст файл оболочки virtualenvwrapper.sh, расположенный в каталоге ~/.local/bin/. Этот каталог используется для хранения двоичных файлов пакетов, которые позволяют использовать пакеты Python непосредственно из терминала.
Перед использованием virtualenvwrapper необходимо отредактировать файл конфигурации. Поскольку я использую bash, то добавлю следующее содержимое в файл .bashrc, расположенный в домашнем каталоге:
cat <<EOT>> ~/.bashrc
# Virtualenwrapper settings
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python
export VIRTUALENVWRAPPER_VIRTUALENV=~/.local/bin/virtualenv
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Documents
source ~/.local/bin/virtualenvwrapper.sh
EOTЭто добавит — запишет в конце файла .bashrc указанное выше содержимое. Если приведённая выше команда не сработала, откройте файл и измените его вручную.
VIRTUALENVWRAPPER_PYTHON указывает на бинарный файл Python вашей машины. Вы можете проверить это с помощью следующей команды (без активации какой-либо виртуальной среды):
which python
/usr/bin/python # Мой результатОбязательно измените ваш .bashrc в соответствии с вашим путём к бинарному файлу Python.
Примечание: Если вы используете Windows, вам следует использовать virtualenvwrapper-win. Virtualenvwrapper будет работать через Command Prompt — cmd.exe, но не будет работать под PowerShell.
Перезагрузите bash с изменениями внесёнными в файл .bashrc, выполнив команду:
source ~/.bashrcТеперь команду mkvirtualenv можно использовать для простого создания новых виртуальных сред, помещённых по умолчанию в папку ~/.virtualenvs (в Windows в папку ~/Envs):
mkvirtualenv sitepointВы можете увидеть папку виртуальной среды sitepoint, введя путь WORKON_HOME, который мы определили как $HOME/.virtualenvs:
ls ~/.virtualenvs
sitepoint # Virtual env folderДля получения списка всех виртуальных сред, созданных virtualenvwrapper, вы можете запустить команду workon без аргументов:
workon
sitepoint # Мой результатВиртуальную среду легко активировать командой workon:
workon sitepointДля деактивации виртуальной среды используется такая же, как и та, которую мы использовали ранее:
deactivateМежду виртуальными средами очень легко переключаться. Например, для работы в другой виртуальной среде:
workon another_virtualenvДля удаления виртуальной среды следует воспользоваться командой rmvirtualenv:
rmvirtualenv sitepointЗаключение
В этом руководстве мы рассмотрели основной процесс, которым должен владеть каждый Python разработчик. Виртуальные среды являются важной частью совместного проекта.