0029 — Управление окружениями Python

Содержимое страницы

Что такое виртуальные окружения

Давным-давно никаких виртуальных окружений Python не было, все пакеты ставили прямо в систему, и всех всё устраивало. Потом стали появляться проблемы — пакет package_a указывает в качестве зависимостей пакет package_req версии 0.0.1, а пакет package_b хочет уже версию 0.0.2. Ставишь в систему package_req версии 0.0.2, и package_a перестаёт работать.

А теперь представьте, что у вас на компьютере личный проект с Django 2.x, а в рабочем проекте до сих пор Django 1.7. Что теперь, каждый раз устанавливать нужную версию Django при переключении между проектами?

А если таких проектов — 3 штуки? И там не только Django, но ещё и psycopg2 гвоздями прибит, и поменять версию никто не даст?

В Ruby эту проблему решили следующим образом — можно параллельно установить несколько версий пакета, а при импорте явно указать нужную. Структура каталога /usr/local/lib/ruby/gems/<версия_Ruby>/gems/ при этом красотой не отличается, зато это работает.

Разработчики Python пошли другим путём и придумали virtualenv. Это такой пакет, который создаёт виртуальные окружения — специальным образом сфорированные каталоги, в коториъ можно ставить любые зависимости Python, и версию интерпретатора тоже можно указать нужную. При необходимости виртуальное окружение активируется, в нём выполняется нужный код, всё работает безо всяких Docker’ов.

Сейчас этот способ считается устаревшим.

venv

В Python 3.3 был добавлен PEP 405 и встроенная поддержка виртуальных окружений. Теперь можно создать виртуальное окружение одной командой:

python -m venv <имя_окружения>

Прямо в текущем каталоге будет создан подкаталог с именем окружения.

Для активации следует использовать команду source:

source ./<каталог_окружения>/bin/activate

Приглашение командной строки при этом изменится — в начале будет выводиться имя окружения, например:

(my-project) dunaevsky@darktower:~/

Для деактивации используется команда deactivate. В целом виртуальное окружение работает почти так же, как системное, но:

  • не требует прав root для установки пакетов;
  • позволяет использовать любую установленную на компьютере версию интерпретатора.

Теперь в одно окружение можно поставить одну версию пакета, а в другое — другую.

pyenv

venv хорошо и удобно, но иногда нужно воспользоваться конкретной версией интерпретатора. Можно собрать из исходников и поставить в систему, но это не всегда хорошая идея. Всё-таки, лучше использовать софт из репозиториев дистрибутива.

В некоторых случаях хочется иметь более новую версию Python’а, но чтобы без установки в систему. Или вдруг захотелось странного, и хочется поставить себе какой-нибудь редкий IPython…

Для решения этой задачи существует pyenv. Эта утилита позволяет установить в пользовательский каталог несколько версий Python’а, а потом их использовать в нужных местах.

pyenv не заменяет собой виртуальные окружения. Это просто менеджер версий Python, установленных на компьютере.

Подготовка к установке

pyenv собирает нужную версию Python из исходного кода, поэтому на компьютере должны быть установлены соответствующие инструменты:

sudo apt update && \
    sudo apt install build-essential make

Установка

pyenv распространяется в виде исходного кода, поэтому самый простой способ его установки — клонирование репозитория:

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

Чтобы работали команды CLI, нжуно добавить в ~/.bashrc строки:

export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

Для большего удобства рекомендую установить также плагин pyenv-virtualenv:

git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv/

Для его корректной работы следует добавить в ~/.bashrc ещё одну строку:

eval "$(pyenv virtualenv-init -)"

Использование

Список установленных версий Python

pyenv versions

Список доступных для установки версий Python

pyenv install --list

Установка нужной версии Python

pyenv install <номер_версии>

Создание виртуального окружения

Для использования активной сейчас версии Python:

pyenv virtualenv <имя>

Для использования нужной версии Python (должна быть в результатах вывода команды pyenv versions):

pyenv virtualenv <версия> <имя>

Активация виртуального окружения

В отличие от окружений, созданных с помощью venv, нет нужды использовать команду source:

pyenv activate <имя>

Деактивация виртуального окружения

Команда чуть длиннее, чем для окружений, созданных через venv:

pyenv deactivate

Удаление виртуального окружения

pyenv virtualenv-delete <имя>

Автоматическая активация

pyenv поддерживает автоматическую активацию нужной версии Python или виртуального окружения при переходе в каталог. Для этого нужно разместить в нём файл .python-version, в котором указать номер версии интерпретатора или имя виртуального окружения.