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