Очевидно, что как минимум разработчику на Python нужен какой-то механизм, позволяющий содержать разные проекты в изолированных "песочницах". Такой механизм существует и называется виртуальные окружения.
Устройство виртуальных окружений
Каждое виртуальное окружение представляет собой директорию, содержимое которой структурно напоминает общесистемное окружение — поддиректории соответственно названы и наполнены. Давайте рассмотрим пример:
$ tree env
env
├── bin
│ ├── activate
│ …
│ ├── pip
│ …
│ └── python3 -> …/python3
├── lib
│ └── python3.6
│ └── site-packages
│ ├── pip
│ │ ├── …
│ …
│ └── setuptools-40.6.2.dist-info
│ ├── …
…
При работе в окружении нужно запускать не системные Python и pip, а исполняемые файлы из папки bin. Дело в том, что интерпретатор Python, когда находится в окружении, знает, что по относительному (к директории bin) пути ../lib/python3.6 находятся все доступные пакеты. И копия pip из директории bin/ устанавливает пакеты в это же окружение, не затрагивая систему. Получается та самая желанная изоляция!
Создание виртуального окружения
Конечно же, вручную создавать всю описанную иерархию директорий и файлов не нужно — для этого есть специальный модуль venv.
В macOS и Windows этот модуль, как и pip, входит в поставку Python. На Ubuntu же его нужно установить отдельно командой
$ sudo apt install python3-venv
Проверим, что модуль установлен и пригоден к использованию:
~$ python3 -m venv --help
Создаётся окружение командой python3 -m venv имя_окружения. Давайте создадим одно и установим в это окружение пакет cowsay:
$ python3 -m venv first_venv
$ first_venv/bin/pip install cowsay
$ first_venv/bin/cowsay hello
Вы можете видеть, что пакет устанавливается вместе с точкой входа, которую можно вызвать командой first_venv/bin/cowsay, а также сам пакет становится доступен интерпретатору, но только тому, что запущен из окружения.
В принципе в таком виде виртуальное окружение уже можно использовать полноценно. Но вводить команды с префиксом first_env/bin/ не очень-то хочется, и есть способ упростить вызов команд, доступных в окружении — активация.
Активация окружения
При создании окружения в поддиректорию bin помещается сценарий оболочки, который на macOS и Ubuntu называется activate, а на Windows — activate.bat. Этот сценарий нужно выполнить:
- на macOS и Ubuntu вызвать команду
$ source first_venv/bin/activate
- на Windows вызвать команду
C:\> first_venv\bin\activate.bat
после активации необходимости указывать путь до вызываемого исполняемого файла.
Ещё вы могли заметить, что приглашение оболочки изменилось: в нём стало отображаться имя окружения. Этот трюк работает на macOS и Ubuntu и позволяет всегда видеть, что мы находимся в виртуальном окружении.
Деактивация же окружения делается командой deactivate, которая становится доступна после активации.
Активирование и деактивация окружения влияют только на текущую сессию (заметны только в этом конкретном терминале). Что позволяет иметь несколько окружений и активировать их одновременно в разных окнах терминала.