Авторы:
Pyenv – менеджер версий python. Позволяет легко переключаться между версиями python любого уровня, вплоть до 3 знака, например 3.8.5 рядом с 3.9.10.
Для чего нужен pyenv.
- Позволяет изменить глобальную версию python для каждого пользователя;
- Обеспечивает поддержку версий python для каждого проекта;
- Позволяет переопределить версию python с помощью переменной среды;
- Находит команды из разных версий python одновременно (может быть полезно для тестирования кода в нескольких средах с различными версиями python).
Как работает pyenv.
Когда вы выполняете команду python или pip, ваша операционная система ищет исполняемый файл с таким именем в списке директорий, хранящемся в переменной окружения PATH. Директории в PATH разделены двоеточием и просматриваются слева-направо (/usr/local/bin:/usr/bin:/bin). Pyenv добавляет директорию shims в начало вашей PATH (/shims:/usr/local/bin:/usr/bin:/bin). Shims – это лёгкие исполняемые файлы, которые просто передают ваши команды pyenv-у.
Таким образом, pyenv перехватывает команды, введённые в системную переменную PATH, с помощью исполняемых файлов shim, определяет версию python, указанную вашим приложением, и передаёт ваши команды нужной сборке python.
Например, при вызове pip, ваша ОС делает следующее:
- ищет в директориях переменной PATH исполняемый файл с именем pip;
- находит в shims в начале вашей PATH исполняемый файл с именем pip;
- запускает этот файл, который в свою очередь передаёт команду pyenv-у.
После вызова исполняемого файла из директории shims, pyenv определяет, какую версию python использовать, считывая её из следующих источников (в указанном порядке):
- Переменная окружения PYENV_VERSION (если определена). Вы можете использовать команду pyenv shell, чтобы установить её в вашем текущем shell.
- Файл .python-version в текущей директории (если существует). Вы можете изменить данный файл в текущей директории с помощью команды pyenv local.
- Первый файл .pyenv-version (если существует хотя бы один), найденный в родительском каталоге, пока не будет достигнута корневая директория вашей системы.
- Глобальный файл $(pyenv root)/version. Вы можете изменить данный файл с помощью команды pyenv global. Если данный файл отсутствует, то pyenv будет считать, что вы хотите использовать “системный” python.
Чтобы указать, что следует применять системную версию python, в качестве имени версии используют слово “system”.
Команда pyenv which <command> показывает, какой на самом деле исполняемый файл будет запущен при вызове command через директорию shims.
После того, как pyenv определил версию python, он передаёт вашу команду соответствующей сборке сборку python-а.
Каждая версия python устанавливается в отдельную директорию в $(pyenv root)/versions (например $(pyenv root)/versions/3.8.5/).
Установка
Далее будет рассмотрена установка для Ubuntu. Порядок установки для других ОС подробно описан в официальном руководстве
https://github.com/pyenv/pyenv .
Клонирование git репозитория
Проверьте, куда вы хотите установить pyenv. Хорошим выбором будет $HOME/.pyenv. Далее склонируем репозиторий с последней версией pyenv:
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
При желании можете попробовать скомпилировать динамическое расширение bash для ускорения pyenv (Если это не удастся, pyenv по прежнему будет нормально работать):
cd ~/.pyenv && src/configure && make -C src
Настройка вашего shell для Pyenv
Порядок настройки:
- Определить переменную окружения PYENV_ROOT, чтобы указать, где pyenv будет хранить свои данные. По дефолту это $HOME/.pyenv. Рекомендуется выбрать то же место, куда был склонирован git репозиторий pyenv.
- Добавить исполняемые файл pyenv в переменную окружения PATH.
- Запустить eval "$(pyenv init -)", чтобы добавить pyenv в ваш shell, включить shims и достраивание. В качестве альтернативы, вы можете запустить eval "$(pyenv init –path)", чтобы включить shims без интеграции с shell.
Далее рассмотрим bash скрипты, выполняющие данную настройку окружения.
Базовый набор файлов bash сильно различается между различными linux дистрибутивами. Самый надёжный способ добавить pyenv в каждый ваш shell – это добавить команды конфигурации как к .bashrc (для интерактивных shell), так и к “файлу профиля”, который bash будет использовать (для login shell).
Добавить команды в ~/.bashrc можно, выполнив следующий скрипт:
echo 'export PYENV_ROOT="$HOME/.pyenv"' » ~/.bashrc echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' » ~/.bashrc echo 'eval "$(pyenv init -)"' » ~/.bashrc
Далее, если в вашей системе есть файлы ~/.profile, ~/.bash_profile или ~/.bash_login, то добавьте команды туда. Если данных файлов нет, добавьте команды в ~/.profile.
Добавление в ~/.profile:
echo 'export PYENV_ROOT="$HOME/.pyenv"' » ~/.profile echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' » ~/.profile echo 'eval "$(pyenv init -)"' » ~/.profile
Добавление в ~/.bash_profile:
echo 'export PYENV_ROOT="$HOME/.pyenv"' » ~/.bash_profile echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' » ~/.bash_profile echo 'eval "$(pyenv init -)"' » ~/.bash_profile
Далее необходимо перезапустить ваш shell (exec "$SHELL"), чтобы изменения PATH вступили в силу.
Прежде чем устанавливать какую-либо версию python, необходимо установить зависимости сборки python (
https://github.com/pyenv/pyenv/wiki#suggested-build-environment). Pyenv сделает всё, чтобы загрузить и скомпилироватьнужную версию Python, но иногда компиляция может завершиться с ошибкой из-за несоответствующих системных зависимостей, или компиляция может завершиться успешно, но при работе с установленной версией Python начнут происходить сбои. Именно для этого и необходимо установить зависимости сборки Python. В Ubuntu сделать это можно с помощью следующей команды:
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
Работа с pyenv
Установка различных версий Python
pyenv install <version>
Пример:
pyenv install 3.10.2
Переключение между версиями Python
Только на время текущего сеанса shell:
pyenv shell <version>
Автоматическое переключение на версию при попадании в директорию, из которой вызывается команда:
pyenv local <version>
Выбор глобальной версии:
pyenv global <version>
Удаление версии Python
pyenv uninstall <version>
В качестве альтернативы можно выполнить rm -rf <directory>, для директории с версией, которую хотите удалить. Найти её можно с помощью команды pyenv prefix <version>.
Список команд pyenv
Запустите команду pyenv commands, чтобы просмотреть список доступных команд. Также pyenv --help выведет список команд с их описанием.
Обновление pyenv
Чтобы перейти на последнюю версию pyenv, используйте git pull:
cd $(pyenv root) git pull
Pyenv-virtualenv
Pyenv-virtualenv – это плагин pyenv, который позволяет управлять виртуальными окружениями и окружениями conda в Unix-подобных системах.
Установка pyenv-virtualenv
Установка в последней версии в директорию $(pyenv root)/plugins/pyenv-virtualenv
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
Далее можно добавить pyenv virtualenv-init в ваш shell, чтобы включить автоматическую активацию виртуальных окружений при входе в конкретную директорию, содержащую файл .python-version.
echo 'eval "$(pyenv virtualenv-init -)"' » ~/.bashrc
Остаётся только перезапустить ваш shell (exec "$SHELL").
Использование pyenv-virtualenv
Чтобы создать виртуальное окружение для версии Python, используемой через pyenv, запустите следующую команду:
pyenv virtualenv <python_version> <virtualenv_name>
Пример:
pyenv virtualenv 3.9.10 myenv_3.9.10
Данная команда создаёт виртуальное окружение на основе python3.9.10 с названием myenv_3.9.10.
Если для pyenv virtualenv задан только один аргумент, виртуальное окружение будет создано с заданным именем на основе текущей версии Python.
Команда pyenv virtualenvs выводит список существующих виртуальных окружений и сред conda.
Некоторые инструменты могут потребовать активации и деактивации виртуального окружения. Сделать это можно с помощью следующих команд:
pyenv activate <name> pyenv deactivate
Удаление существующего виртуального окружения выполняется с помощью команды
pyenv uninstall <virtualenv_name>
или
pyenv virtualenv-delete <virtualenv_name>