Виртуальное окружение
Вам наверное известно, что pip
устанавливает пакеты в одно из двух окружений — в общесистемное или пользовательское. Интерпретатор Python при импорте модуля или пакета ищет его сначала в пользовательском окружении, затем — в общесистемном. Такая последовательность позволяет пользователю иметь нужные именно ему версии библиотек и Python-программ.
Но даже двух окружений недостаточно, когда программист начинает работать с несколькими проектами, ведь разные проекты могут иметь разные наборы зависимостей. Еще более тяжелый случай: разные проекты могут зависеть от общей библиотеки, но требовать разные ее версии — тогда происходит конфликт версий.
Очевидно, что разработчику на Python нужен какой-то механизм, позволяющий содержать разные проекты в изолированных песочницах. Такой механизм существует. Он называется виртуальные окружения.
Устройство виртуальных окружений¶
Каждое виртуальное окружение представляет собой директорию. Ее содержимое структурно напоминает общесистемное окружение — поддиректории соответственно названы и наполнены. Давайте рассмотрим пример:
tree env
env
├── bin
│ ├── activate
│ …
│ ├── pip
│ …
│ └── python3 -> …/python3
├── lib
│ └── python3.6
│ └── site-packages
│ ├── pip
│ │ ├── …
│ …
│ └── setuptools-40.6.2.dist-info
│ ├── …
…
bin/
, внутри которой расположены: - Копия интерпретатора под именем
python3
(символическая ссылка на оригинал) - Копия исполняемого файла
pip
В соседней директории по пути lib/python3.6/site-packages
есть библиотеки, уже установленные в окружение. Как правило, только что созданное окружение имеет:
- Установленный пакет pip (исполняемый файл
bin/pip
— его точка входа) - Пакет Setuptools Эти два пакета составляют необходимый минимум для разработки проекта на Python.
При работе в окружении нужно запускать не системные Python и pip, а исполняемые файлы из директории bin
. Когда интерпретатор Python находится в окружении, он знает, где находятся все доступные пакеты. Интерпретатор находит их по относительному пути ../lib/python3.6
. В таком случае копия pip
из директории bin/
устанавливает пакеты в это же окружение, не затрагивая систему. Получается та самая изоляция.
Встроенный venv¶
Создание виртуального окружения¶
Вручную создавать всю описанную иерархию директорий и файлов не нужно — для этого есть специальный модуль venv
.
В macOS и Windows этот модуль входит в поставку Python. На Linux его нужно установить отдельно командой:
sudo apt install python3-venv
Проверим, что модуль установился и готов к использованию:
python3 -m venv --help
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR ...]
Обычно окружение создается командой
# python3 -m venv имя_окружения.
python -m venv .venv
(На Mac и Linux из-за точки в начале имени файл будет скрыт.
Чтобы увидеть его в списке файлов, используйте команду ls -a).
Вы можете указать любое имя каталога вместо .venv
Давайте попробуем создать виртуальное окружение и установить туда пакет telebot
.
# python3 -m venv .venv
# .venv/bin/pip install telebot
Вы можете видеть, что пакет устанавливается вместе с точкой входа, которую можно вызвать командой .venv/bin/telebot
. Также сам пакет становится доступен интерпретатору, но только тому, что был запущен из окружения.
В таком виде виртуальное окружение уже можно использовать полноценно. Но постоянно вводить команды с префиксом .venv/bin/
не очень удобно. Есть способ упростить вызов команд, доступных в окружении — это активация.
Активация виртуального окружения¶
При создании окружения в поддиректорию bin
помещается сценарий оболочки, который на macOS и Ubuntu называется activate
, а на Windows — activate.bat
. Чтобы выполнить этот сценарий, нужно вызвать команду:
-
на macOS и Linux:
source .venv/bin/activate
-
на Windows:
C:\> .venv\Scripts\activate.bat
В команде выше обратите внимание, что в Windows поддиректория с исполняемыми файлами называется не bin
, а Scripts
.
После активации предложение командной строки должно измениться: в нем появится имя каталога виртуального окружения. Что-то вроде:
(.venv) [default command prompt] $
Это работает на macOS и Linux и всегда напоминает, что мы находимся в виртуальном окружении.
Так же после активации отпадает необходимость указывать путь до вызываемого исполняемого файла. Теперь telebot
и python
вызываются без префикса, но это все те же команды из окружения.
Деактивация виртуального окружения¶
Деактивация окружения делается командой deactivate
, которая становится доступна после активации.
(.venv) $ deactivate
Активация и деактивация окружения влияют только на текущую сессию — то есть заметны только в этом конкретном терминале. Это удобно, потому что так можно иметь несколько окружений и активировать их одновременно в разных окнах терминала.
Инструменты для управления виртуальным окружением¶
Возникло множество инструментов для управления виртуальным окружением. Встроенный (venv
) мы рассмотрели, теперь рассмотрим другие:
virtualenv¶
-
Установить virtualenv
pip install virtualenv
-
Установить virtualenvwrapper-win (Windows)
pip install virtualenvwrapper-win
Как пользоваться:
-
Создайте виртуальную среду с именем
HelloWorld
mkvirtualenv HelloWorld
Все, что мы установим сейчас, будет относиться к этому проекту. И доступны для проектов, которые мы подключаем к этой среде.
-
Установить каталог проекта
Чтобы связать наш virtualenv с нашим текущим рабочим каталогом, мы просто вводим:
setprojectdir .
-
Деактивировать
Чтобы перейти к чему-то другому, в командной строке введите
deactivate
, чтобы деактивировать вашу среду.deactivate
Обратите внимание, как скобки исчезают.
-
Workon
Откройте командную строку и введите
workon HelloWorld
, чтобы активировать среду и перейти в корневую папку проекта.workon HelloWorld
Poetry¶
-
Установить Poetry
pip install --user poetry
-
Создать новый проект
poetry new my-project
Это создаст каталог my-project:
my-project ├── pyproject.toml ├── README.rst ├── poetry_demo │ └── __init__.py └── tests ├── __init__.py └── test_poetry_demo.py
Файл pyproject.toml будет управлять вашим проектом и его зависимостями:
[tool.poetry] name = "my-project" version = "0.1.0" description = "" authors = ["your name <your@mail.com>"] [tool.poetry.dependencies] python = "*" [tool.poetry.dev-dependencies] pytest = "^3.4"
-
Пакеты
Чтобы добавить зависимости в свой проект, вы можете указать их в разделе tool.poetry.dependencies:
[tool.poetry.dependencies] pendulum = "^1.4"
Кроме того, вместо того, чтобы вручную изменять файл pyproject.toml, вы можете использовать команду
add
, и она автоматически найдет подходящее ограничение версии.$ poetry add pendulum
Чтобы установить зависимости, перечисленные в pyproject.toml:
poetry install
Чтобы удалить зависимости:
poetry remove pendulum
Для получения дополнительной информации смотрите документацию или прочитайте здесь:
Python проеты с Poetry и VSCode
Pipenv¶
-
Установка pipenv
pip install pipenv
-
Войдите в каталог вашего проекта и установите пакеты для вашего проекта.
cd my_project pipenv install <package>
Pipenv установит ваш пакет и создаст для вас Pipfile в каталоге вашего проекта. Pipfile используется для отслеживания того, какие зависимости нужны вашему проекту на случай, если вам потребуется их переустановить.
-
Удалить пакеты
pipenv uninstall <package>
-
Активируйте виртуальную среду, связанную с вашим проектом Python.
pipenv shell
-
Выйти из виртуальной среды
exit
Дополнительную информацию и видео можно найти на сайте docs.pipenv.org.
Anaconda¶
Как пользоваться:
-
Создайте виртуальную среду
conda create -n HelloWorld
-
Чтобы использовать виртуальную среду, активируйте ее:
conda activate HelloWorld
Все, что установлено сейчас, будет относиться к проекту HelloWorld.
-
Выйти из виртуальной среды
conda deactivate