На этом шаге мы рассмотрим преимущества использования виртуальных сред.
Решение этих проблем заключается в том, чтобы отделить вашу среду Python так называемыми виртуальными средами (virtual environment). Они позволяют вам отделять зависимости Python на основе того или иного проекта и предоставляют возможность выбирать между различными версиями интерпретатора Python.
Виртуальная среда - это изолированная среда Python. Физически она располагается внутри папки, содержащей все пакеты и другие программные средства, от которых они зависят, в виде библиотек с нативным (платформенно-ориентированным) кодом и средой выполнения интерпретатора, в которых нуждается проект Python. (За кадром, чтобы сэкономить место, эти файлы могут быть символическими ссылками, а не реальными копиями.)
Чтобы продемонстрировать работу виртуальной среды, представим небольшую пошаговую демонстрацию, в которой выполним настройку новой виртуальной среды (или virtualenv, как ее называют для краткости), а затем установим в нее сторонний пакет.
Прежде всего проверим, где в настоящее время располагается глобальная среда Python. В Linux или macOS для проверки пути к менеджеру пакетов pip мы можем использовать инструмент командной строки which:
$ which pip3 /usr/local/bin/pip3
Можно размещать свои виртуальные среды прямо в папки проектов, чтобы держать их в безупречном виде и отделенными от остальных. Но вы также можете где-нибудь иметь специальный каталог "python-environments", который содержит все ваши среды для проектов. Выбор за вами.
Давайте создадим новую виртуальную среду Python:
$ python3 -m venv ./venv
python -m venv venv
Эта команда за одну минуту создаст новую папку venv в текущем каталоге, а также заполнит ее базовой средой Python 3:
$ ls venv/ bin Include Lib pyvenv.cfg
Если вы проверите активную версию pip (командой which), то увидите, что она по-прежнему указывает на глобальную среду:
(venv) $ which pip3 /usr/local/bin/pip3
Это означает, что если установить пакеты сейчас, то они по-прежнему окажутся в глобальной среде Python. Одного создания папки виртуальной среды недостаточно - вам нужно явным образом активировать новую виртуальную среду, чтобы последующие выполнения команды pip указывали на нее:
$ source ./venv/bin/activate (venv) $
venv\Scripts\activate.bat
Выполнение команды activate конфигурирует текущий сеанс вашей оболочки, чтобы вместо этого использовать Python и команды pip из виртуальной среды.
Обратите внимание на то, как это изменило вид подсказки в строке командной оболочки, и теперь она содержит название активной виртуальной среды в круглых скобках: (venv). Давайте проверим, какой исполняемый файл pip теперь активен:
(venv) $ which pip3 /Users/dan/my-project/venv/bin/pip3
python -c "import site; print(site.getsitepackages())"
Как видите, выполнение команды pip3 теперь будет запускать ту версию, которая находится в виртуальной среде, а не глобальной. То же касается и исполняемого файла интерпретатора Python. Выполнение python из командной строки теперь также загрузит интерпретатор из папки venv:
(venv) $ which python /Users/dan/my-project/venv/bin/python
Обратите внимание: она по-прежнему представляет собой "чистую доску", абсолютно пустую среду Python. Выполнение команды pip list покажет почти пустой список установленных пакетов, который будет включать только базовые модули, необходимые для поддержки pip как такового:
(venv) $ pip list pip (9.0.1) setuptools (28.8.0)
Давайте пойдем дальше и теперь установим пакет Python в виртуальную среду. Для этого вам следует применить знакомую команду pip install:
(venv) $ pip install schedule
Collecting schedule
Downloading schedule-0.4.2-py2.py3-none-any.whl
Installing collected packages: schedule
Successfully installed schedule-0.4.2
Здесь вы заметите два важных изменения. Во-первых, для выполнения этой команды вам больше не будут нужны права доступа администратора. И во-вторых, инсталляция или обновление пакета с активной виртуальной средой означают, что все файлы окажутся в подпапке каталога виртуальной среды.
По этой причине программные средства, от которых зависит ваш проект, будут физически отделены от всей другой среды Python в вашей системе, включая глобальную. Практически вы получаете клон среды выполнения Python, который предназначен только для одного проекта.
Еще раз выполнив pip list, вы увидите, что библиотека schedule была успешно установлена в новую среду:
(venv) $ pip list pip (9.0.1) schedule (0.4.2) setuptools (28.8.0)
Если запустить сеанс интерпретатора Python командой python или выполнить им автономный файл .py, то он будет использовать интерпретатор Python и зависимости, установленные в эту виртуальную среду, - при условии, что эта среда по-прежнему активна в текущем сеансе оболочки.
Но как снова деактивировать или "покинуть" виртуальную среду? Аналогично команде activate, существует команда deactivate, которая возвращает вас назад к глобальной среде:
(venv) $ deactivate $ which pip3 /usr/local/bin
Использование виртуальных сред поможет сохранить вашу систему лаконичной, а ваши зависимости Python аккуратно организованными. В качестве практической рекомендации: все ваши проекты Python должны использовать виртуальные среды, чтобы отделять их зависимости от других и избегать конфликтов версий.
Понимание и использование виртуальных сред также направит вас по правильному пути использования более продвинутых методов управления зависимостями, таких как определение зависимостей проекта при помощи файлов requirements.txt.
На следующем шаге мы подитожим изученный материал.