Python: Виртуальные среды — это просто

Источник: «Virtual Environments in Python Made Easy»
Большинство новичков не знают, как настроить в Python среду разработки, соответствующую последним стандартам, используемым профессиональными программистами. В этом руководстве вы узнаете, как правильно создать полностью работающую среду разработки Python с использованием лучших отраслевых рекомендаций.

Виртуальные среды / Virtual Environments

Виртуальная среда помогает решать конфликты зависимостей проекта, создавая изолированные среды. Эти изолированные среды содержат все полезные вещи, которые могут понадобиться Python программистам для разработки своих проектов.

Виртуальные среды включают новую копию двоичных файлов Python и автономную копию всей стандартной библиотеки Python. Поэтому она может работать сама по себе.

Использование виртуальной среды даёт следующие преимущества:

Потребность в виртуальных средах

Я использую много библиотек для своих проектов. Среди них три фреймворка для разработки веб-приложений, а также есть другие библиотеки, которые я хотел бы изучать в будущем. Это служит основным аргументом в пользу того, что серьёзные проекты на 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.х, есть два варианта:

  1. Если эта команда вернула версию Python 2.х, вам нужно использовать Python 3.х вместе с этим руководством.
  2. Если вы получили ошибку Неизвестная команда, попробуйте запустить 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Команда активации виртуальной среды
POSIXbash/zshsource (venv-name)/bin/activate
fishsource (venv-name)/bin/activate.fish
csh/tcshsource (venv-name)/bin/activate.csh
PowerShell Core(venv-name)/bin/Activate.ps1
Windowscmd.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.txt

requirements.txt — файл, содержащий все зависимости проекта, конкретные версии пакетов.

Для генерации файла зависимостей вашего проекта, вы можете выполнить следующую команду:

pip freeze > requirements.txt

Если вы хотите установить определённую версию пакета, вы можете запустить pip install, за которым следует имя пакета, двойной знак равенства (==) и версия пакета:

pip install package==version

Мы также можем удалить пакет с нашей машины или виртуальной среды:

pip uninstall some-package-name

Virtualenv

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 в изолированной среде, и через неё установить virtualenvpipx 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 Promptcmd.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 разработчик. Виртуальные среды являются важной частью совместного проекта.

Дополнительные материалы

Предыдущая Статья

Архитектурная концепция Laravel: Сервис Провайдеры

Следующая Статья

Laravel: Беспарольная аутентификация