Несколько версий 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 позволит иметь почти неограниченное количество версий, виртуальных окружений для ваших проектов и экспериментов.