Перейти к содержанию

Виртуальное окружение

Вам наверное известно, что 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

Ошибка! Если вместо этого вы видите что-то вроде "The virtual environment was not created successfully because ensurepip is not available" или другую ошибку, связанную особенностями вашего дистрибутива, почитайте, как установить pip и 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

  1. Установить virtualenv

    pip install virtualenv
    
  2. Установить virtualenvwrapper-win (Windows)

    pip install virtualenvwrapper-win
    

Как пользоваться:

  1. Создайте виртуальную среду с именем HelloWorld

    mkvirtualenv HelloWorld
    

    Все, что мы установим сейчас, будет относиться к этому проекту. И доступны для проектов, которые мы подключаем к этой среде.

  2. Установить каталог проекта

    Чтобы связать наш virtualenv с нашим текущим рабочим каталогом, мы просто вводим:

    setprojectdir .
    
  3. Деактивировать

    Чтобы перейти к чему-то другому, в командной строке введите deactivate, чтобы деактивировать вашу среду.

    deactivate
    

    Обратите внимание, как скобки исчезают.

  4. Workon

    Откройте командную строку и введите workon HelloWorld, чтобы активировать среду и перейти в корневую папку проекта.

    workon HelloWorld
    

Poetry

С сайта Poetry Poetry — это инструмент для управления зависимостями и упаковки в Python. Он позволяет вам объявить библиотеки, от которых зависит ваш проект, и он будет управлять (устанавливать/обновлять) их для вас.

  1. Установить Poetry

    pip install --user poetry
    
  2. Создать новый проект

    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"
    
  3. Пакеты

    Чтобы добавить зависимости в свой проект, вы можете указать их в разделе 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 Pipenv — это инструмент, цель которого — привнести лучшее из мира пакетов (bundler, composer, npm, Cargo, yarn и т. д.) в мир Python.

  1. Установка pipenv

    pip install pipenv
    
  2. Войдите в каталог вашего проекта и установите пакеты для вашего проекта.

    cd my_project
    pipenv install <package>
    

    Pipenv установит ваш пакет и создаст для вас Pipfile в каталоге вашего проекта. Pipfile используется для отслеживания того, какие зависимости нужны вашему проекту на случай, если вам потребуется их переустановить.

  3. Удалить пакеты

    pipenv uninstall <package>
    
  4. Активируйте виртуальную среду, связанную с вашим проектом Python.

    pipenv shell
    
  5. Выйти из виртуальной среды

    exit
    

Дополнительную информацию и видео можно найти на сайте docs.pipenv.org.

Anaconda

Anaconda еще один популярный инструмент для управления пакетами Python. Anaconda — это опенсорсный дистрибутив языков программирования Python и R для data science, цель которого — упростить управление пакетами и их развертывание. Версии пакетов в Anaconda управляются системой управления пакетами conda, которая анализирует текущую среду перед выполнением установки, чтобы не нарушить работу других фреймворков и пакетов.

Как пользоваться:

  1. Создайте виртуальную среду

    conda create -n HelloWorld
    
  2. Чтобы использовать виртуальную среду, активируйте ее:

    conda activate HelloWorld
    

    Все, что установлено сейчас, будет относиться к проекту HelloWorld.

  3. Выйти из виртуальной среды

    conda deactivate