Несколько версий Python. Установка и использование pyenv.
Предназначение pyenv
Пакет pyenv для меня решает две основные задачи:
- Удобное, быстрое, комфортное управление установленными версиями интерпретатора Python.
- Сохранение целостности и работоспособности операционной системы в которую, как правило, уже как-то интегрирована какая-то версия Python.
Что это означает на практике?
Например вы используете для продакшна версию 3.8.2 и вместе с этим появилось желание новые проекты переводить на на версию 3.9.5, которая вышла несколько дней назад. Есть риски что вы можете сломать зависимости в проектах, настройки путей, да мало-ли какие бывают странности. Так вот, pyenv даст возможность видеть список доступных версий/дистрибутивов Python, установить, переключаться между версиями и не только.
Например, вы можете выбрать дефолтную версию для системы в целом и какие-то другие версии для отдельных проектов. Причем выбор конкретной версии интерпретатора будет происходить автоматически при смене каталога.
Это реальная ситуация присутствует и на Маках и на Линуксе. Было много историй, когда при обновлении версии Python например перестает работать менеджер пакетов apt. Значит есть необходимость максимально исключить зависимости между ОС и интерпретаторами Python.
Установка pyenv для Ubuntu Linux/ Mac
1. Загружаем pyenv
Будет не лишним прочитать документацию в разделе Installation
Приведенные команды дадут вам установленный в домашний каталог пользователя пакет pyenv, который необходимо будет еще поднастроить на втором этапе.
Ubuntu & Mac, рекоменуемый способ установки:
# Linux:
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
Альтернативный, но, с моей точки зрения менее правильный вариант для Мака. Связано это с тем, что новые версии могут появляться с опозданием:
# MacOS:
% brew update
% brew install pyenv
2. Настройки окружения
Дополним переменную PATH для поиска исполняемых файлов pyenv:
# Linux:
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
# MacOS:
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init --path)"' >> ~/.zshrc
# Linux:
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
# MacOS
% echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc
После этого шага необходимо закрыть консоль (разлогиниться) и зайти вновь для того чтобы сделанные изменения применились. На этом почти все готово, но есть нюанс…
3. Установка pyenv-virtualenv
Необязательный этап
Возможно вам понадобится еще одно дополнение для pyenv, которое позволит настраивать виртуализацию среды Python для каких-либо конкретных приложений. В моем случае этот способ удобен для использования NeoVim. А у меня интеграция с редактором настроена для разработки кода Python и установленные плагины тоже активно используют Python.
# Linux:
$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
# MacOS:
% brew install pyenv-virtualenv
Использование pyenv в Ubuntu Linux/ Mac
Первым делом мы хотим установить в систему одну или несколько версий интерпретатора. Нужно определиться с версией. Это сделать легко:
# Например, мы ищем доступные версии в ветке 3.9
$ pyenv install --list | grep 3.9
3.9.0
3.9-dev
3.9.1
3.9.2
3.9.3
3.9.4
3.9.5
miniconda-3.9.1
miniconda3-3.9.1
miniconda3-3.9-4.9.2
Установка выбранной версии (3.9.5):
$ pyenv install 3.9.5
Downloading Python-3.9.5.tar.xz...
-> https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz
Installing Python-3.9.5...
Installed Python-3.9.5 to /home/user/.pyenv/versions/3.9.5
Если произошла ошибка
В этом месте у некоторых возникает ошибка связанная с отсутствием установленного компилятора GCC или с наличием каких-то других неудовлетворенных зависимостей:checking for gcc... no checking for cc... no checking for cl.exe... no configure: error: in `/tmp/python-build.20210518150017.23041/Python-3.9.5': configure: error: no acceptable C compiler found in $PATH
Скорее всего это говорит о том, что необходимо установить зависимости. На GitHub есть вся необходимая информация как исправить эту ситуацию:
# Ubuntu Linux sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
# MacOS brew install openssl readline sqlite3 xz zlib
После этого необходимо повторить установку дистрибутива Python
Просмотр установленных версий интерпретатора:
В примере ниже видно, что на Маке установлены три версии интерпретатора, и активной (дефолтной) является версия 2.7.18. Активной эта версия стала из-за того что я перешел в каталог который настроен для использования именно этой версии Python:
$ pyenv versions
system
* 2.7.18 (set by /Users/user/work/py_env/.python-version)
2.7.18/envs/pynvim2
2.8
3.9.4
3.9.4/envs/2.8
3.9.4/envs/pynvim3
pynvim2
pynvim3
Настроить каталог на определенную версию Python
Это делается с помощью команды:
# Устанавливается локальная версия Python 3.9.4
$ pyenv local 3.9.4
$ python3 --version
Python 3.9.4
# Можно указать сразу две версии:
$ pyenv local 3.9.4 2.7.18
# Если глобально установлена версия 3.9.2, то при отсутствии
# иного указания будет использоваться глобальная версия:
$ pyenv local 2.7.18
$ python --version
Python 2.7.18
$ python3 --version
Python 3.9.2 # Глобальная версия версия Python 3.9.2
Установка глобальной (дефолтной) версии Python
% pyenv global 2.8
% pyenv versions
system
2.7.18
2.7.18/envs/pynvim2
* 2.8 (set by /Users/dmn/.pyenv/version)
3.9.4
3.9.4/envs/2.8
3.9.4/envs/pynvim3
pynvim2
pynvim3
В каком сценарии удобно использовать плагин pyenv-virtualenv
В случае с Neovim, мы указываем путь к интерпретатору который нам возвращает команда pyenv which python
после активации.
То есть Neovim бужет вызывать явно указанный нами интерпретатор работающий в отдельном виртуальном окружении.
$ pyenv virtualenv 3.9.5 pynvim3
$ pyenv activate pynvim3
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
$ python3 -m pip install pynvim
$ pyenv which python
# Обратите внимание по какому пути будет вызван интерпретатор:
$ pyenv which python
/home/user/.pyenv/versions/pynvim3/bin/python
Заключение
Использование pyenv очень желательно и лично мной рекомендуется в ситуации, когда в операционной системе уже установлена какая-либо версия Python (и ОС с этой версией тесно интегрирована) и при этом вам нужно установить еще одну версию. В MacOS и Ubuntu Linux при этом возникает риск как минимум сильно усложнить себе работу в такой среде.
Применение pyenv позволит иметь почти неограниченное количество версий, виртуальных окружений для ваших проектов и экспериментов.