Как установить другую версию python
У меня стоит pyhton 3.8 . Но мне нужно установить pyhton 3.7 (на то есть причины). Нужно ли мне удалять pyhton 3.8 , чтобы сделать это, и если нужно то как? Если что у меня операционная система Linux и модель Linux Mint 18 .
Отслеживать
48.6k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 29 мая 2020 в 18:02
Kate Adams Kate Adams
17 1 1 серебряный знак 4 4 бронзовых знака
Не модель, а дистрибутив
29 мая 2020 в 18:03
Можно через pip поставить всё что угодно и каких угодно версий в домашний каталог.
29 мая 2020 в 23:57
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Но мне нужно установить pyhton 3.7
Устанавливайте на здоровье. Только не «руками», а системным установщиком пакетов. Что там у вас — dnf / zypper / yum.
Нужно ли мне удалять pyhton 3.8
На самом деле, Вам нужно разобраться с тем, какая программа на питоне какой конкретный интерпретатор питона использует. До сих пор есть много приложений, которые написаны для питона 2.7
Если все Ваши скрипты будут использовать 3.7, то проще всего, в каталоге /usr/bin/ выполнить команду:
sudo ln -s python3.7 python
Тогда все обращения к интерпретатору питона будут вызывать именно версию 3.7.
Но это довольно рискованный путь. В системе есть куча файлов на питоне и решать за всех — не стоит.
Если же Вам просто нужно, что бы конкретно Ваши программы исполнялись в версии 3.7, то пропишите это явно в каждой вашей программе в первой строке так:
#!/usr/bin/python3.7
и всё будет именно так, как Вы хотите.
Установка нескольких версий Python параллельно при помощи pyenv
В большинстве операционных систем Python предустановлен (ну, кроме Windows, но даже там теперь есть команда python , которая предложит установить интерпретатор из магазина приложений). В Unix-подобных операционных системах, таких как Linux и MacOS, Python пустил корни очень глубоко. Множество компонентов ОС рассчитывают, что Python установлен и работает стабильно. Это и хорошо, и плохо.
Это хорошо, потому что хотя бы какой-то Python в большинстве систем доступен из коробки — бери и пользуйся. Иногда доступно сразу несколько версий интерпретатора, например, python2 указывает на устаревшую версию 2.7, python3 — на какую-нибудь стабильную версию Python 3, типа 3.6 или 3.7, а просто python указывает либо на одно, либо на другое (в последнее время предпочтение чаще отдаётся третьей версии). Для обучения или для тестирования этого может быть вполне достаточно.
С другой стороны, это плохо, потому что, как правило, предустановленный Python настолько стабилен, что уже успел зарасти мхом. В некоторых системах до сих пор предустановлен только Python 2, но даже если вам повезёт получить Python третьей версии, то наверняка он будет отставать от последней версии на пару минорных релизов. Не факт, что вам это подойдёт.
Иногда нужно иметь сразу несколько версий Python для работы над разными проектами, например, 3.7 и 3.8. В некоторых ОС нужные версии можно установить через пакетный менеджер (например, в Fedora через dnf) — из основных репозиториев или из сторонних. Но зачастую такие репозитории содержат не все релизы интерпретаторов, а лишь выбранное мейнтейнерами репозиториев подмножество.
Решение у всех этих проблем одно — нужно установить недостающие версии интерпретатора, какими бы они ни были. Этому и посвящён пост.
pyenv
pyenv — утилита, которая позволяет легко переключаться между несколькими версиями интерпретатора Python, а также устанавливать новые. Позволяет устанавливать, наверное, вообще все известные науке версии интерпретаторов Python. Работает просто и незаметно.
pyenv — это всего лишь один из последователей аналогичного инструмента из мира Ruby — rbenv . Есть ещё и nodenv для Node.js, который тоже вдохновился rbenv .
Проект написан целиком на bash . Это значит, что он никак не зависит от Python — было бы забавно, если бы для установки Python нужен был бы Python. Также это означает, что на Windows pyenv работать не будет (тред с обсуждением). Следует отметить, что в Windows проблема установки нескольких версий и не возникает — там всегда можно скачать и установить сколько угодно интерпретаторов с официального сайта, а pylauncher поможет выбрать из них нужную версию. Кроме того, пользователи современных версий Windows могут использовать pyenv внутри WSL (Windows Subsystem for Linux). Ещё это означает, что у авторов много отваги — я бы не решился писать на bash что-то настолько сложное. Как же хорошо, что всё уже написано.
Установка
- Скачаем pyenv . Установка pyenv производится простым клонированием git-репозитория. У проекта есть умный скрипт, который скачает pyenv и его сотоварищей:
$ curl https://pyenv.run | bash
WARNING: seems you still have not added 'pyenv' to the load path. # Load pyenv automatically by adding # the following to ~/.bashrc: export PATH="~/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"
В случае с zsh нужно будет добавить те же самые строки в ~/.zshrc . В случае с fish в связи с особенностями самого шелла инструкции отличаются:
# Load pyenv automatically by adding # the following to ~/.config/fish/config.fish: set -x PATH "~/.pyenv/bin" $PATH status --is-interactive; and . (pyenv init -|psub) status --is-interactive; and . (pyenv virtualenv-init -|psub)
$ pyenv --version pyenv 1.2.18
Как это работает
pyenv работает благодаря манипуляциям над переменной окружения $PATH . Эта переменная содержит в себе список директорий, в которых ОС будет искать исполняемые файлы, вызванные без указания полного пути. Именно благодаря этой переменной мы можем в терминале вместо /bin/cat вызывать просто cat . Когда мы набираем в терминале имя программы ( cat ), ОС перебирает директории из $PATH слева направо, пока в одной из них (в данном примере /bin ) не найдёт программу с именем cat , которую и запустит. Поиск прекращается после первого совпадения.
Команда pyenv init — , которую мы добавили в конфиг шелла ( .bashrc или аналог) добавляет директории pyenv в самое начало переменной $PATH . Зачем это нужно? pyenv создаёт небольшие исполняемые файлы, так называемые файлы-прослойки (shims), для всех команд, которыми он собирается управлять, например, python , pip , ipython и так далее. Эти файлы-прослойки должны попасть в $PATH прежде самих управляемых программ и «затенить» системные python , pip и так далее. Эти файлы-прослойки в конечном счёте просто вызывают сам pyenv с нужными аргументами. Таким образом pyenv перехватывает обращения к некоторым именам, и анализируя поступившую к нему информацию, принимает решение о том, какую именно версию Python нужно запустить. При выборе версии pyenv принимает во внимание следующие факторы в указанном порядке:
- Переменная окружения PYENV_VERSION , если указана. В неё можно указать какую конкретно версию Python нужно использовать в рамках текущего сеанса. Удобно, если вам по какой-то причине понадобится сменить выбранную версию интерпретатора, например, в одном из окон терминала.
- Локальная версия Python. При помощи специального файла .python-version можно настроить версию интерпретатора для определенного проекта. Захо́дите внутрь директории ( cd project/ ), и pyenv внезапно понимает, что нужно сменить Python. Выхо́дите обратно — версия Python меняется на глобальную. Это распространяется и на все поддиректории проекта — pyenv рекурсивно ищет файл .python-version вверх по файловой системе, пока не дойдёт до корня.
- Глобальная версия Python. В файле ~/.pyenv/version записана глобальная версия Python, которая будет использоваться по умолчанию, если не сконфигурирована локальная версия.
Вам вряд ли придётся вручную трогать эти файлы, потому что у pyenv есть удобные команды ( pyenv local и pyenv global ), чтобы ими управлять, но знать о файлах всё равно полезно.
Использование
Установка новой версии Python
Сначала посмотрим, какие версии Python pyenv может установить:
$ pyenv install --list . 3.6.0 3.6-dev 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.6.9 3.6.10 3.7.0 3.7-dev 3.7.1 3.7.2 3.7.3 3.7.4 3.7.5 3.7.6 3.7.7 3.8.0 3.8-dev 3.8.1 3.8.2 3.9.0a6 3.9-dev .
Список довольно длинный, поэтому я его подсократил. Обычно вас будут интересовать такие версии, как 3.8.2 или 3.7.7 — это версии самой распространённой реализации интерпретатора CPython. Но если вам нужна экзотика, то pyenv умеет устанавливать любые сорта интерпретаторов Python ( pypy3.6-7.3.0 , stackless-3.7.5 , jython-2.7.1 , ironpython-2.7.7 , micropython-1.12 и т.д.). Для вас ведь не стало новостью, что существует много разных реализаций интерпретатора Python?
Установим CPython 3.8.2:
$ pyenv install 3.8.2 Downloading Python-3.8.2.tar.xz. Installing Python-3.8.2.
Через пару минут ожидания ваш новоиспечённый Python будет готов.
Можно сразу же назначить эту версию глобальной:
$ pyenv global 3.8.2 $ python -V Python 3.8.2
Давайте в целях демонстрации установим ещё парочку интерпретаторов:
$ pyenv install 2.7.18 $ pyenv install 3.9.0a6
Получим список установленных версий интерпретатора:
$ pyenv versions 2.7.18 * 3.8.2 (set by /home/br0ke/.pyenv/version) 3.9.0a6
Кстати, если нужно, то можно делать активными сразу несколько версий одновременно:
$ pyenv global 3.8.2 2.7.18
Теперь вывод версий покажет следующее:
$ pyenv versions * 2.7.18 (set by /home/br0ke/.pyenv/version) * 3.8.2 (set by /home/br0ke/.pyenv/version) 3.9.0a6
А работать это будет вот таким образом:
$ python -V Python 3.8.2 $ python3 -V Python 3.8.2 $ python2 -V Python 2.7.18
Грубо говоря, та версия, которая указана первой (3.8.2), имеет приоритет и занимает все нужные ей имена. Следующие версии (2.7.18) могут занять любые оставшиеся свободные имена (в данном случае, это только имя python2 ).
А файл глобальной версии ~/.pyenv/version на данный момент имеет вот такое содержимое:
$ cat ~/.pyenv/version 3.8.2 2.7.18
Локальная версия
Давайте создадим директорию и войдём в неё:
$ mkdir my_project $ cd my_project
Представим, что в этой директории мы будем разрабатывать некий проект, на котором мы хотим опробовать фишки нового Python 3.9. Сообщим об этом pyenv :
$ pyenv local 3.9.0a
В директории появился файл .python-version со следующим содержимым:
$ cat .python-version 3.9.0a6
На данный момент список версий показывает следующее (удобно использовать эту команду, чтобы понять какую версию и почему pyenv активирует):
$ pyenv versions 2.7.18 3.8.2 * 3.9.0a6 (set by /home/br0ke/my_project/.python-version)
Изменения немедленно вступили в силу:
$ python -V Python 3.9.0a6
Но эта конфигурация никак не влияет на работу pyenv вне директории проекта:
$ cd .. $ python -V 3.8.2
Как и в случае с глобальной конфигурацией, можно локально активировать сразу несколько версий интерпретатора.
Установим IPython
Часто бывает нужно установить какой-нибудь пакет так, чтобы он тоже стал доступен из командной строки. Допустим, что нам нужно установить ipython — более удобную версию REPL Python. Сделаем это:
$ cd my_project $ pip install ipython
$ ipython Python 3.9.0a6 (default, May 3 2020, 16:58:20) Type 'copyright', 'credits' or 'license' for more information IPython 7.14.0 -- An enhanced Interactive Python. Type '?' for help. In [1]:
Программа сразу доступна, благодаря тому, что pyenv очень умный и создал новый файл-прослойку (shim) автоматически:
$ which ipython /home/br0ke/.pyenv/shims/ipython
Вне директории с проектом ipython будет недоступен, ведь он же установлен в локальный интерпретатор 3.9.0a6 , а снаружи активирован другой интерпретатор — можете проверить самостоятельно.
Возникают ситуации, когда по какой-то причине прослойка не создалась или с ней случилось что-то ещё, например, удалилась:
$ rm $(which ipython) $ ipython No such file or directory
Не беда! Можно попросить pyenv пересоздать их все заново:
$ pyenv rehash
И всё работает снова:
$ ipython Python 3.9.0a6 (default, May 3 2020, 16:58:20) Type 'copyright', 'credits' or 'license' for more information IPython 7.14.0 -- An enhanced Interactive Python. Type '?' for help. In [1]:
Можно вообще добавить команду pyenv rehash в свой ~/.bashrc (или аналог), чтобы при запуске шелла гарантированно иметь рабочие файлы-прослойки (shims).
Заключение
pyenv — очень удобный и полезный инструмент в ситуациях, когда нужную вам версию Python нельзя установить средствами операционной системы. Я вообще предпочитаю устанавливать все нужные мне версии интерпретатора самостоятельно через pyenv или asdf , даже если ОС уже содержит точно такую же версию — пусть ОС использует свою копию для служебных целей, а я для разработки буду использовать свою собственную копию, где смогу проводить любые кровавые эксперименты, не боясь поломать ОС.
Обязательно подпишитесь на уведомления о новых постах в блоге, чтобы ничего не пропустить!
Дополнительное чтение
- Репозиторий проекта на GitHub;
- Туториал на RealPython;
- Альтернатива: универсальный менеджер версий asdf .
Как установить другую версию python
Некоторые программные инструменты для своей работы требуют наличие установки определенной версии Python (например, так у меня получилось с компилятором NPU для процессора GX8002 []). Утилита pyenv позволяет держать на компьютере несколько версий Python и легко переключаться между ними. Даже если в системе уже установлен Python, стоит установить pyenv, чтобы можно было легко опробовать новые языковые функции альтернативных версий Python.
System Python. Системный Python это Python, установленный в операционной системе. Если вы находитесь на Mac или Linux, то по умолчанию, когда вы набираете python в вашем терминале, вы как раз запускаете этот системный Python.
Так почему бы не использовать этот системный Python? Ведь Python уже устанавливается вместе с операционной системой Linux. Это можно увидеть с помощью команды which :
$ which python /usr/bin/python
Здесь python доступен для всех пользователей, о чем свидетельствует его место расположения /usr/bin/python. Версию Python можно узнать командой python -V , и может сложиться ситуация, когда это не та версия, которая нужна:
$ python -V Python 2.7.12
Чтобы установить пакет в системный Python, вам нужно запускать sudo pip install . Это установит пакет Python глобально, что создаст проблему, если другой пользователь захочет установить более старую версию пакета.
Проблемы с несколькими версиями одного и того же пакета нарастают, и часто проявляются в самый неожиданный момент. Вдруг ни с того ни с сего популярный и стабильный пакет внезапно нарушает стабильную работу системы. После нескольких часов попыток устранить проблему и гугления вы можете обнаружить, что установили не ту версию зависимости, и потеряли на это целый день.
Даже если ваша версия Python установлена в /usr/local/bin/python3, то это все равно не гарантирует безопасности. Вы все еще можете столкнуться с описанными выше проблемами.
Кроме того, у вас нет большого контроля на дтем, какая версия Python будет установлена вместе с вашей операционной системой Linux. Если вы хотите использовать последнюю версию Python, и ваша система например Ubuntu, то вам может не повезти. Версии Python по умолчанию могут быть слишком старые, т. е. придется ждать новую версию операционной системы.
И наконец, некоторые операционные системы для своей работы могут использовать упакованную версию Python. Например yum для своей работы использует Python. Если вы установите новую версию Python, и не позабоитесь о том, чтобы правильно установить его в свое пространство пользователя, то это может серьезно нарушить работу операционной системы.
Package Manager. Следующее, на что надо обратить внимание — менеджеры пакетов, такие как apt , yum , brew или port . Так или иначе, именно с их помощь вы устанавливаете в систему большинство пакетов. К сожалению, при использовании менеджеров пакетов вы столкнетесь с теми же самыми проблемами.
По умолчанию менеджеры пакетов как правило устанавливает свои пакеты в глобальное системное пространство вместо рабочего пространства пользователя. Эти пакеты системного уровня загрязняют вашу среду разработки, и затрудняют совместную работу с другими пользователями.
И опять у вас нет контроля, какую версию Python вы можете установить. Некоторые репозитории предоставляют выбор, но по умолчанию вы столкнетесь любой версией Python, которую выбрал поставщик ПО или предпочитает техподдержка вашей организации.
Даже если вы устанавливаете Python из менеджера пакетов, подумайте, что произойдет, если вы пишете пакет и хотите поддерживать и тестировать Python версий 3.4 — 3.7.
Что произойдет, когда вы набираете в системе команду python3? Как легко вы можете переключиться между разными версиями? Если захотите использовать PyPy, Jython или Miniconda, то скорее всего с менеджером пакетов вам не повезет.
С учетом этих ограничений давайте рассмотрим критерии, которые позволят просто и гибко устанавливать версии Python и управлять ими:
1. Установка Python в ваше пространство пользователя.
2. Установка нескольких версий Python.
3. Возможность указать именно ту версию Python, которая нужна.
4. Переключение между установленными версиями.
Утилита pyenv даст вам все эти возможности, и даже больше.
[Установка pyenv]
Перед установкой самой утилиты pyenv понадобится обеспечить некоторые специфичные для операционной системы зависимости. Эти зависимости в основном утилиты разработки, написанные на C, и они потребуются, потому что pyenv устанавливает Python путем сборки его из исходного кода. Здесь мы рассмотрим наиболее распространенные способы установки этих зависимостей.
Примечание: утилита pyenv изначально не поддерживала Windows. Однако с некоторых пор появилась базовая поддержка со стороны проекта pyenv-win. Если вы используете Windows, попробуйте pyenv-win.
Зависимости сборки. Утилита pyenv выполняет сборку выбранной версии Python из исходного кода, т. е. вам нужно собрать зависимости, которые фактически использует pyenv. Зависимости сборки специфичны для используемой платформы. Если вы используете Ubuntu/Debian, то для установки зависимостей введите команду (эта команда использует Apt для установки всех зависимостей сборки):
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \ libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl
Если при запуске этой команды столкнулись с ошибкой «Unable to locate package python-openssl», то удалите этот пакет из командной строки, и запустите её заново. С такой ошибкой я столкнулся на Raspberry Pi 2 b.
Если вы используете Fedora/CentOS/RHEL, то для установики зависимостей сборки используйте yum:
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite \ sqlite-devel openssl-devel xz xz-devel libffi-devel
Под macOS можно использовать команду brew (сработает менеджер пакетов Homebrew):
$ brew install openssl readline sqlite3 xz zlib
Совет: когда работает Mojave или более свежая версия (10.14+) то вам также понадобится установить дополнительные заголовки SDK:
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
Если используется openSUSE, то запустите команду:
$ zypper in zlib-devel bzip2 libbz2-devel libffi-devel \ libopenssl-devel readline-devel sqlite3 sqlite3-devel xz xz-devel
И наконец, для пользователей Alpine можно ввести команду (в качестве менеджера пакетов используется apk):
$ apk add libffi-dev ncurses-dev openssl-dev readline-dev \ tk-dev xz-dev zlib-dev
Установка pyenv с помощью pyenv-installer. После того, как все зависимости были установлены, воспользуйтесь инсталлятором pyenv с помощью команды:
$ curl https://pyenv.run | bash
Эта команда установит pyenv вместе с некоторыми полезными плагинами:
pyenv : само приложение pyenv.
pyenv-virtualenv : плагин для pyenv и виртуальных рабочих окружений.
pyenv-update : плагин для обновления pyenv.
pyenv-doctor : плагин для проверки, что установлена pyenv и зависимости сборки.
pyenv-which-ext : плагин для автоматического поиска системных команд.
Примечание: показанная выше команда curl делает то же самое, что и загрузка срипта pyenv-installer и его локальный запуск. Так что если вы захотите узнать, что на самом деле будет происходить при установке, то можете посмотреть на содержимое этого скрипта. Альтернативно, если вы не хотите запускать этот скрипт, то можете попробовать выполнить инструкции по установке вручную.
При запуске команды curl https://pyenv.run | bash вы можете столкнуться с ошибкой наподобие следующей:
$ curl https://pyenv.run | bash % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 curl: (60) SSL certificate problem: self signed certificate in certificate chain More details here: https://curl.haxx.se/docs/sslcerts.html curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above.
Эта ошибка легко исправляется, если добавить в командную строку опцию -k, которая отключает проверку сертификата. Для этого откройте ссылку https://pyenv.run, вы увидите текст скрипта, который надо подправить:
$ wget —no-check-certificate https://pyenv.run
$ mv index.html setup-pyenv.sh
Мы получим файл вот такого содержимого:
#!/bin/bash
# Usage: curl https://pyenv.run | bash
# index_main() set -e curl -s -S -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
> index_main
Добавьте в этом скрипте после curl опцию -k:
curl -k -s -S -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
После этого добавьте к скрипту атрибут, разрешающий выполнение, и запустите его:
$ chmod +x setup-pyenv.sh $ ./setup-pyenv.sh
После завершения работы скрипта вы увидите что-то наподобие следующего:
WARNING: seems you still have not added 'pyenv' to the load path.
Load pyenv automatically by adding the following to ~/.bashrc:
export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"
Здесь даны указания, какие строчки надо добавить в профиль настройки рабочего окружения по умолчанию (файл ~/.bashrc). Этот вывод будет зависеть от вашего шелла. Вам нужно последовать этим указаниям, чтобы добавить pyenv в пути поиска запускаемых программ (переменная окружения PATH), и инициализировать pyenv/pyenv-virtualenv auto completion. Например, на Ubuntu для настройки терминала bash добавтье в конец файла ~/.bashrc следующие строки:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
После того, как это было сделано, нужно перезагрузить ваш шелл (или просто закройте окно терминала и снова откройте его):
$ exec "$SHELL"
На этом все. Теперь у вас есть готовая к работе утилита pyenv и её плагины.
[Использование pyenv для установки Python]
Следующим шагом после установки pyenv будет установка нужной версии Python. Вы можете выбрать и установить множество версий Python. Например, если ван нужно посмотреть, какие есть версии Python от 3.6 до 3.8, то можете ввести команду:
$ pyenv install --list | grep " 3\.[678]" 3.6.0 3.6-dev 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.7.0 3.7-dev 3.7.1 3.7.2 3.8-dev
Подобным образом, если нам надо увидеть все версии Jython:
$ pyenv install --list | grep "jython" jython-dev jython-2.5.0 jython-2.5-dev jython-2.5.1 jython-2.5.2 jython-2.5.3 jython-2.5.4-rc1 jython-2.7.0 jython-2.7.1
После того, как вы определились с версией Python, которую хотите установить, введите команду с указанием версии. Например, для установки Python 3.6.15:
$ pyenv install -v 3.6.15
Поскольку эта команда установит Python путем сборки из исходников, то процесс может занять некоторое время. Если вы не хотите видеть вывод процесса установки, то не указывайте ключ -v:
$ pyenv install 3.6.15
Таким же образом можно установить несколько версий Python:
$ pyenv install 2.7.18
Совет для профи: если вы используете pyenv в течение некоторого времени, и не обнаружили версию Python, которую хотели бы установить, то может понадобиться выполнить команду pyenv update, чтобы получить доступ к последним версиям Python.
Дополнительную информацию по pyenv и решению проблем см. в репозитории [4].
Каталог установки. Как уже упоминалось, утилита pyenv работает путем сборки Python из исходников. Все собранные таким способом версии она сохраняет в свой корневой каталог ~/.pyenv/versions/, например:
$ ls ~/.pyenv/versions/ 2.7.15 3.6.8 3.8-dev
Вывод этой команды показывает каталоги 2.7.15, 3.6.8, 3.8-dev, где установлены соответствующие версии Python. Любую из этих установленных версий можно удалить командой rm . Например, если нужно удалить Python 2.7.15:
$ rm -rf ~/.pyenv/versions/2.7.15
Также есть эквивалентная команда pyenv uninstall , с помощью которой можно удалить указанную версию:
$ pyenv uninstall 2.7.15
Управление версиями Python. Следующая команда показывает, какие версии Python у вас установлены:
$ pyenv versions * system (set by /home/имяпользователя/.pyenv/version) 2.7.15 3.6.8 3.8-dev
Здесь * указывает, что в настоящий момент активна системная версия Python. Также это показывает, что системная версия установлена файлом, который находится в корневом каталоге pyenv. Т. е. по умолчанию все еще используется ваша системная версия Python:
$ python -V Python 2.7.12
Если вы попробуете это проверить с помощью команды which , то увидите:
$ which python /home/имяпользователя/.pyenv/shims/python
Такое поведение может показаться необычным, но так работает pyenv. Утилита pyenv вставляет сама себя в вашу переменную окружения PATH, и с точки зрения операционной системы это вызываемый исполняемый бинарник. Если вы хотите увидеть реальный путь, то выполните команду:
$ pyenv which python /usr/bin/python
Например, если вы хотите переключиться на другую версию Python, то используйте команду global :
$ pyenv global 2.7.15 $ python -V Python 2.7.15
$ pyenv versions system * 2.7.15 (set by /home/имяпользователя/.pyenv/version) 3.6.8 3.8-dev
Совет для профи: хорошим способом проверить, что только что установленная версия Python работает правильно, будет запуск встроенного теста:
$ pyenv global 3.8-dev
$ python -m test
Эта команда запустит набор внутренних тестов Python, которые проверят вашу инсталляцию.
Если захотите вернуться обратно на системную версию Python, которая была по умолчанию:
$ pyenv global system $ python -V Python 2.7.12
Команда pyenv global дает возможность непринужденно переключаться между разными версиями Python.
[Обзор команд pyenv]
Вот так можно посмотреть список доступных команд:
$ pyenv commands --version activate commands completions deactivate doctor exec global help . virtualenvs whence which
Каждая команда из этого списка с помощью флага —help позволяет получить более подробную информацию о команде. Например, если нужно получить информацию о команде shims :
$ pyenv shims --help Usage: pyenv shims [--short] List existing pyenv shims
install . Эту команду мы уже рассматривали выше. Она позволяет установить определенную версию Python. Например, если вы хотите установить Python 3.6.8, запустите:
$ pyenv install 3.6.8
В консоли будет отображен процесс загрузки и установки Python. Вот некоторые флаги, которые могут оказаться полезными:
| Флаг | Описание |
| -l (—list) | Перечислит все доступные для установки версии Python. |
| -g (—debug) | Выполнит сборку отладочной верси Python. |
| -v (—verbose) | Подробный режим: будет выводить состояние процесса компиляции в stdout. |
versions . Команда versions покажет все установленные в настоящий момент версии Python:
$ pyenv versions * system (set by /home/имяпользователя/.pyenv/version) 2.7.15 3.6.8 3.8-dev
Этот вывод показывает не только установленные верисии 2.7.15, 3.6.8, 3.8-dev, но также и ваш установленный системный Python, и звездочка показывает, что системный Python в настоящий момент активный. Если вас интересует только текущая активная версия, то используйте команду version :
$ pyenv version system (set by /home/имяпользователя/.pyenv/version)
Эта команда подобна команде versions, но отличается тем, что показывает только текущую активную версию.
which . Команда which помогает определить полный путь до системных исполняемых файлов. Поскольку pyenv работает через прокладки (shims), команда which позволит вам увидеть полный путь до исполняемого файла, который запускает pyenv. Например, если нужно увидеть, где находится запускаемая команда pip, то запустите команду:
$ pyenv which pip /home/имяпользователя/.pyenv/versions/3.6.8/bin/pip
В выводе будет показан полный системный путь до pip.
global . Команда global установит глобальную версию Python. Это может быть отменено другими командами, однако полезно, чтобы гарантировать, что по умолчанию использутся определенная версия Python. Если вы хотите использовать по умолчанию Python 3.6.8, то запустите команду:
$ pyenv global 3.6.8
Эта команда установит ~/.pyenv/version на 3.6.8. Для дополнительной информации см. далее «Как указать вашу версию Python».
local . Команда local часто используется для установки версии Python, специфичной для приложения. Например следующая команда:
$ pyenv local 2.7.15
.. создаст файл .python-version в вашей текущей директории. Если в вашем рабочем окружении активна pyenv, то этот файл будет автоматически для текущего каталога активировать версию Python 2.7.15.
shell . Команда shell используется для установки версии Python, специфичной для шелла. Например, если вы хотите протестить версию Python 3.8-dev, то запустите команду:
$ pyenv shell 3.8-dev
Эта команда активирует версию, указанную путем установки переменной окружения PYENV_VERSION. Эта команда перезапишет любые настройки приложения или глобальные настройки. Если вы хотите деактивировать версию, то можете использовать флаг —unset.
[Как указать вашу версию Python]
Одна из наиболее запутанных частей pyenv заключается в том, как именно разрешается команда python, и какие команды можно использовать для изменения этого разрешения. Как было показано выше, существует 3 способа модифицировать используюмую версию python (комадами global, local и shell). Как эти команды взаимодействую друг с другом?
Порядок поиска и разрешения команд выглядит примерно так:

Эта пирамида означает, что чтение происходит сверху вниз. Будет использовано первое, что pyenv сможет найти. Рассмотрим простой пример:
$ pyenv versions * system (set by /home/имяпользователя/.pyenv/version) 2.7.15 3.6.8 3.8-dev
Здесь используется системный Python, что обозначено звездочкой *. Для выполнения следующего наиболее глобального параметра используется global :
$ pyenv global 3.6.8 $ pyenv versions system 2.7.15 * 3.6.8 (set by /home/имяпользователя/.pyenv/version) 3.8-dev
Здесь видно, что pyenv хочет использовать 3.6.8 в качестве версии Python. Это также показывает, где находится файл версии. Можно также посмотреть содержимое этого файла:
$ cat ~/.pyenv/version 3.6.8
Давайте теперь создадим файл .python-version командой local :
$ pyenv local 2.7.15 $ pyenv versions system * 2.7.15 (set by /home/имяпользователя/.python-version) 3.6.8 3.8-dev $ ls -a . .. .python-version $ cat .python-version 2.7.15
Здесь снова pyenv указывает, как разрешается наша команда python. На этот раз это происходит из ~/.python-version. Обратите внимание, что поиск файла .python-version является рекурсивным:
$ mkdir subdirectory $ cd subdirectory $ ls -la # здесь нет файла .python-version . .. $ pyenv versions system * 2.7.15 (set by /home/имяпользователя/.python-version) 3.6.8 3.8-dev
Несмотря на то, в подкаталоге subdirectory нет файла .python-version, версия все еще устанавливается на 2.7.15 потому что файл .python-version присутствует в родительской директории для папки subdirectory.
И наконец, можно установить версию Python командой shell :
$ pyenv shell 3.8-dev $ pyenv versions system 2.7.15 3.6.8 * 3.8-dev (set by PYENV_VERSION environment variable)
Все это делается установкой переменной окружения PYENV_VERSION :
$ echo $PYENV_VERSION 3.8-dev
Если вы слишком перегружены этими опциями, то см. описание процесса управления этими файлами «Работа с несколькими рабочими окружениями», в основном используя local.
[Виртуальные рабочие окружения и pyenv]
Virtual Environment большая часть системы управления инсталляциями и приложениями Python. Если вы раньше ничего не слышали про виртуальные рабочие окружения, см. букварь [5].
Виртуальные рабочие окружения и pyenv образуют идеальную интеграцию. У pyenv есть отличный плагин pyenv-virtualenv, который сильно облегчает работу с несколькимиверсиями Python и несколькими виртуальными окружениями. Если вы сходу не разобрались, в чем разница между pyenv, pyenv-virtualenv и инструментами наподобие virtualenv или venv, то не волнуйтесь. Вы не один такой.
Вот что вам следует знать:
• pyenv управляет несколькими версиями самого Python.
• virtualenv/venv управляет виртуальными окружениями для определенной версии Python.
• pyenv-virtualenv управляет виртуальными окружениями для различных версий Python.
Если вы фанатичный пользователь virtualenv или venv, не беспокойтесь: pyenv прекрасно уживается с ними обоими. Фактически вы можете придерживаться старого рабочего процесса, который вам так нравится, но на самом деле pyenv-virtualenv вероятно обогатила бы ваш опыт по переключению между несколькими окружениями, которые требуют разные версии Python.
Хорошая новость: как только вы запустили скрипт pyenv-installer для установки pyenv, одновременно была установлена и готова к работе утилита pyenv-virtualenv.
[Создание виртуальных рабочих окружений]
Виртуальное окружение создается одной командой:
Технически указывать версию python необязательно, но это лучше указывать, чтобы иметь четкое представление, какая версия Python используется в виртуальном окружении.
Здесь имя_окружения это просто удобное для вас имя, помогающее отделять одно виртуальное окружение от другого. Хорошей практикой будет давать такое же имя для ваших окружений, что и имя проекта. Например, если вы работаете над проектом myproject, и хотите в нем работать с Python 3.6.8, то запустите команду:
$ pyenv virtualenv 3.6.8 myproject
Вывод команды покажет, что устанавливается несклько дополнительных пакетов Python, а именно wheel, pip и setuptools. Это делается строго для удобства, и просто более полно настраивает каждое виртуальное рабочее окружение.
Активация ваших версий. После того, как вы создали свое виртуальное рабочее окружение, следующим шагом должна быть его активация. Это делается командой local :
$ pyenv local myproject
Здесь вы опять видите уже знакомую команду pyenv local, но на этот раз вместо указания версии Python вы указываете окружение. Эта команда создаст файл .python-version в вашей текущей рабочей директории, и потому что вы запустили eval «$(pyenv virtualenv-init -)» в своем рабочем окружении, виртуальное окружение автоматически активируется.
Это можно проверить, запустив команду:
$ pyenv which python /home/имяпользователя/.pyenv/versions/myproject/bin/python
Здесь можно видеть, что была создана новая версия с именем myproject, и исполняемая команда python указывает на эту версию. Если вы посмотрите на любой исполняемый файл, который предоставляет эта среда, то увидите то же самое. Например для pip:
$ pyenv which pip /home/имяпользователя/.pyenv/versions/myproject/bin/pip
Если вы не сконфигурировали команду «$(pyenv virtualenv-init -)» для запуска в вашем шелл (редактированием файла ~/.bashrc), то запустите свой шелл, и в нем можете вручую активировать и деактивировать свои версии Python:
$ pyenv activate $ pyenv deactivate
Выше было описано, что делает pyenv-virtualenv, когда происходит вход в директорию или выход из неё, где находится файл .python-version.
[Работа с несколькими рабочими окружениями]
Если объединить все, что мы уже научились, то получится эффективная работа с несколькими рабочими окружениями. Предположим, что у нас установлены версии:
$ pyenv versions * system (set by /home/имяпользователя/.pyenv/version) 2.7.15 3.6.8 3.8-dev
И темерь нам нужно работать с двумя различными проектами:
1. Проект project1 с поддержкой Python 2.7 и 3.6.
2. Проект project2 с поддержкой Python 3.6 и экспериментами с 3.8-dev.
Как мы уже видели из вывода команды pyenv versions, по умолчанию используется системный Python (обозначено *). Сначала создадим витуальное окружение для первого проекта:
$ cd project1/ $ pyenv which python /usr/bin/python $ pyenv virtualenv 3.6.8 project1 . $ pyenv local project1 $ python -V /home/имяпользователя/.pyenv/versions/project1/bin/python
Обратите внимание, что если мы выйдем из директории проекта, то по вернемся обратно к системному Python:
$ cd $HOME $ pyenv which python /usr/bin/python
Повторим такие шаги для создания виртуального окружения второго проекта:
$ cd project2/ $ pyenv which python /usr/bin/python $ pyenv virtualenv 3.8-dev project2 . $ pyenv local 3.8-dev $ pyenv which python /home/имяпользователя/.pyenv/versions/3.8-dev/bin/python
Теперь мы можем переключаться между проектами, и при этом будут автоматически активироваться их отдельные виртуальные окружения:
$ cd project2/ $ python -V Python 3.8.0a0 $ cd ../project1 $ python -V Python 3.6.8
Можно больше не заботиться о том, чтобы активировать окружения: вы можете переключаться между своими проектами, и pyenv будет сама заботиться об этом, автоматически активируя корректные версии Python и корректные виртуальные окружения.
[Одновременнаая активация нескольких версий]
Как было описано в примере выше, project2 использует экспериментальные фичи Python 3.8. Предположим, что вы решили убедиться, что код проекта project2 все еще работает на Python 3.6. Если вы попытаетесь запустить python3.6, то получите следующее:
$ cd project2/ $ python3.6 -V pyenv: python3.6: command not found
The `python3.6' command exists in these Python versions: 3.6.8 3.6.8/envs/project1 project1
Утилита pyenv информирует вас о том, что хотя Python 3.6 недоступен в текущем активном рабочем окружении, он доступен в других окружениях. И pyenv предоставляет вам способ активировать несколько окружений сразу знакомой командой local :
$ pyenv local project2 3.6.8
Эта команда указывает для pyenv, что вы хотите использовать виртуальное окружение project2 в качестве первой опции. Так что если команда, например python, может быть распознана в обоих окружениях, то сначала будет браться настройка из project2 перед 3.6.8. Посмотрим, что произойдет, если вы запустите:
$ python3.6 -V Python 3.6.8
Здесь утилита pyenv попыталась команду python3.6, и потому что она была найдена в окружении, который активен, то её можно запустить. Это особенно полезно для таких инструментов, как tox, требующих доступности несколько версий Python в переменной PATH.
Совет профи: если вы используете tox и pyenv, то обратите внимание на пакет tox-pyenv.
Предположим, что в примере выше вы обнаружили проблему совместимости с вашей библиотекой, и хотели бы выполнить некое локальное тестирование. Это тестирование требует установки всех зависимостей. Тогда вы должны выполнить следующие шаги для создания нового окружения:
$ pyenv virtualenv 3.6.8 project2-tmp $ pyenv local project2-tmp
Как только вы удовлетворились своим локальным тестированием, можете переключиться обратно в свое окружение по умолчанию:
$ pyenv local project2 3.6.8
[Заключение]
Теперь вы можете более просто работать с проектом, которому нужно поддерживать несколько вариантов рабочих окружений. Также вы можете более просто тестировать последние и полезные версии Python, не беспокоясь о том, что потеряете свою станцию разработки. И все это с помощью отличного инструмента: pyenv.
Как вы видели, pyenv может помочь:
• Установить несколько разных версий Python.
• Переключаться между установленными версиями.
• Использовать виртуальные рабочие окружения вместе с pyenv.
• Автоматически активировать разные версии Python и виртуальные окружения.
[Бонус: отображение имени окружения в командной строке шелла]
Если вы часто переключаетесь между окружениями с разными версиями Python, то вероятно заметили, что нет прямой подсказки о том, какая версия сейчас активна. Автор статьи [1] рекомендует oh-my-zsh [6] и тему agnoster [7], которые делают приглашение командной строки примерно таким:

С помощью этих инструментов отпадает необходиость каждый раз запускать python -V или pyenv version, чтобы понять, какая версия Python сейчас активна. Чтобы это работало, в приглашение командной строки добавляется ссылка на виртуальное окружение:

В этом примере версия Python соответствует project1-venv, что сразу отображается в начале приглашения командной строки. Если вам это понравилось, то вы можете использовать тему agnoster-pyenv [8].
[Ссылки]
Как установить другую версию python
На одной рабочей машине одновременно может быть установлено несколько версий Python. Это бывает полезно, когда идет работа с некоторыми внешними библиотеками, которые поддерживают разные версии python, либо в силу каких-то других причин нам надо использовать несколько разных версий. Например, на момент написания статьи последней и актуальной является версия Python 3.11 . Но, допустим, необходимо также установить версию 3.10 , как в этом случае управлять отдельными версиями Python?
Windows
На странице загрузок https://www.python.org/downloads/ мы можем найти ссылку на нужную версию:

И также загрузить ее и установить:

Чтобы при использовании интерпретатора Python не прописывать к нему весь путь, добавим при установке его в переменные среды. Но здесь надо учитывать, что в переменных среды может содержаться несколько путей к разным интерпретаторам Python:

Та версия Python, которая находится выше, будет версией по умолчанию. С помощью кнопки «Вверх» можно нужную нам версию переместить в начало, сделав версией по умолчанию. Например, в моем случае это версия 3.11. Соответственно, если я введу в терминале команду
python --version
