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
, в котором указать номер версии интерпретатора или имя виртуального окружения.