[updated for 2021]
(Regardless if you are on Mac, Linux, or Windows:)
If you are confused about how to start the latest version of python, on most platforms it is the case that python3
leaves your python2
installation intact (due to the above compatibility reasons); thus you can start python3 with the python3
command.
Historically…
The naming convention is that generally, most scripts will call python2 or python3 explicitly. This happened due to a need for backwards compatibility.
Even though technically python doesn’t even guarantee backwards compatibility between minor versions, Python3 really breaks backwards compatibility. At the time, programs invoking ‘python
‘ were expecting python2 (which was the main version at the time). Extremely old systems may have programs and scripts which expect python
=python2, and changing this would break those programs and scripts.
At the time this answer was written, OP should not have changed this due to maintaining compatibility for old scripts.
Circa year 2021…
Nowadays, many years after the python2->python3 transition, most software explicitly refers to python2 or python3 (at least on Linux). For example, they might call #!/usr/bin/env python2
or #!/usr/bin/env python3
. This has for example (python-is-python3-package) freed up the python command to be settable to a user default, but it really depends on the operating system.
The prescription for how distributions should handle the python
command was written up in 2011 as PEP 394 — The «python» Command on Unix-Like Systems. It was last updated in June 2019.
Basically if you are writing a library, you should specify the version of python (2 or 3, or finer-grained under specific circumstances) you can use. Otherwise as an end user, you should feel free to rename this for your own personal use (though your OS or distribution may not make that easy).
Shell alias:
You could, however, make a custom alias in your shell. The way you do so depends on the shell, but perhaps you could do alias py=python3
, and put it in your shell startup file. This will only work on your local computer (as it should), and is somewhat unnecessary compared to just typing it out (unless you invoke the command constantly).
Confused users should not try to create aliases or virtual environments or similar that make python
execute python3
; this is poor form.This is acceptable nowadays, but PEP 394 suggests encouraging users to use a virtualenv instead.
Different 3.* versions, or 2.* versions:
In the extremely unlikely case that if someone comes to this question with two python3 versions e.g. 3.1 vs 3.2, and you are confused that you have somehow installed two versions of python, this is possibly because you have done manual and/or manual installations. You can use your OS’s standard package/program install/uninstall/management facilities to help track things down, and perhaps (unless you are doing dev work that surprisingly is impacted by the few backwards-incompatible changes between minor versions) delete the old version (or do make uninstall
if you did a manual installation). If you require two versions, then reconfigure your $PATH
variable so the ‘default’ version you want is in front; or if you are using most Linux distros, the command you are looking for is sudo update-alternatives
. Make sure any programs you run which need access to the older versions may be properly invoked by their calling environment or shell (by setting up the var PATH
in that environment).
A bit about $PATH
sidenote: To elaborate a bit on PATH: the usual ways that programs are selected is via the PATH
(echo $PATH
on Linux and Mac) environment variable. You can always run a program with the full path e.g. /usr/bin/🔳 some args
, or cd /usr/bin
then ./🔳 some args
(replace blank with the ‘echo’ program I mentioned above for example), but otherwise typing 🔳 some args
has no meaning without PATH
env variable which declares the directories we implicitly may search-then-execute files from (if /usr/bin
was not in PATH
, then it would say 🔳: command not found
). The first matching command in the first directory is the one which is executed (the which
command on Linux and Mac will tell you which sub-path this is). Usually it is (e.g. on Linux, but similar on Mac) something like /usr/bin/python
which is a symlink to other symlinks to the final version somewhere, e.g.:
% echo $PATH
/usr/sbin:/usr/local/bin:/usr/sbin:usr/local/bin:/usr/bin:/bin
% which python
/usr/bin/python
% which python2
/usr/bin/python2
% ls -l /usr/bin/python
lrwxrwxrwx 1 root root 7 Mar 4 2019 /usr/bin/python -> python2*
% ls -l /usr/bin/python2
lrwxrwxrwx 1 root root 9 Mar 4 2019 /usr/bin/python2 -> python2.7*
% ls -l /usr/bin/python2.7
-rwxr-xr-x 1 root root 3689352 Oct 10 2019 /usr/bin/python2.7*
% which python3
/usr/bin/python3
% ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 9 Mar 26 2019 /usr/bin/python3 -> python3.7*
% ls -l /usr/bin/python3.7
-rwxr-xr-x 2 root root 4877888 Apr 2 2019 /usr/bin/python3.7*
% ls -l /usr/bin/python*
lrwxrwxrwx 1 root root 7 Mar 4 2019 /usr/bin/python -> python2*
lrwxrwxrwx 1 root root 9 Mar 4 2019 /usr/bin/python2 -> python2.7*
-rwxr-xr-x 1 root root 3689352 Oct 10 2019 /usr/bin/python2.7*
lrwxrwxrwx 1 root root 9 Mar 26 2019 /usr/bin/python3 -> python3.7*
-rwxr-xr-x 2 root root 4877888 Apr 2 2019 /usr/bin/python3.7*
lrwxrwxrwx 1 root root 33 Apr 2 2019 /usr/bin/python3.7-config -> x86_64-linux-gnu-python3.7-config*
-rwxr-xr-x 2 root root 4877888 Apr 2 2019 /usr/bin/python3.7m*
lrwxrwxrwx 1 root root 34 Apr 2 2019 /usr/bin/python3.7m-config -> x86_64-linux-gnu-python3.7m-config*
lrwxrwxrwx 1 root root 16 Mar 26 2019 /usr/bin/python3-config -> python3.7-config*
lrwxrwxrwx 1 root root 10 Mar 26 2019 /usr/bin/python3m -> python3.7m*
lrwxrwxrwx 1 root root 17 Mar 26 2019 /usr/bin/python3m-config -> python3.7m-config*
sidenote2: (In the rarer case a python program invokes a sub-program with the subprocess
module, to specify which program to run, one can modify the paths of subprocesses with sys.path
from the sys module or the PYTHONPATH
environment variable set on the parent, or specifying the full path… but since the path is inherited by child processes this is not remotely likely an issue.)
[updated for 2021]
(Regardless if you are on Mac, Linux, or Windows:)
If you are confused about how to start the latest version of python, on most platforms it is the case that python3
leaves your python2
installation intact (due to the above compatibility reasons); thus you can start python3 with the python3
command.
Historically…
The naming convention is that generally, most scripts will call python2 or python3 explicitly. This happened due to a need for backwards compatibility.
Even though technically python doesn’t even guarantee backwards compatibility between minor versions, Python3 really breaks backwards compatibility. At the time, programs invoking ‘python
‘ were expecting python2 (which was the main version at the time). Extremely old systems may have programs and scripts which expect python
=python2, and changing this would break those programs and scripts.
At the time this answer was written, OP should not have changed this due to maintaining compatibility for old scripts.
Circa year 2021…
Nowadays, many years after the python2->python3 transition, most software explicitly refers to python2 or python3 (at least on Linux). For example, they might call #!/usr/bin/env python2
or #!/usr/bin/env python3
. This has for example (python-is-python3-package) freed up the python command to be settable to a user default, but it really depends on the operating system.
The prescription for how distributions should handle the python
command was written up in 2011 as PEP 394 — The «python» Command on Unix-Like Systems. It was last updated in June 2019.
Basically if you are writing a library, you should specify the version of python (2 or 3, or finer-grained under specific circumstances) you can use. Otherwise as an end user, you should feel free to rename this for your own personal use (though your OS or distribution may not make that easy).
Shell alias:
You could, however, make a custom alias in your shell. The way you do so depends on the shell, but perhaps you could do alias py=python3
, and put it in your shell startup file. This will only work on your local computer (as it should), and is somewhat unnecessary compared to just typing it out (unless you invoke the command constantly).
Confused users should not try to create aliases or virtual environments or similar that make python
execute python3
; this is poor form.This is acceptable nowadays, but PEP 394 suggests encouraging users to use a virtualenv instead.
Different 3.* versions, or 2.* versions:
In the extremely unlikely case that if someone comes to this question with two python3 versions e.g. 3.1 vs 3.2, and you are confused that you have somehow installed two versions of python, this is possibly because you have done manual and/or manual installations. You can use your OS’s standard package/program install/uninstall/management facilities to help track things down, and perhaps (unless you are doing dev work that surprisingly is impacted by the few backwards-incompatible changes between minor versions) delete the old version (or do make uninstall
if you did a manual installation). If you require two versions, then reconfigure your $PATH
variable so the ‘default’ version you want is in front; or if you are using most Linux distros, the command you are looking for is sudo update-alternatives
. Make sure any programs you run which need access to the older versions may be properly invoked by their calling environment or shell (by setting up the var PATH
in that environment).
A bit about $PATH
sidenote: To elaborate a bit on PATH: the usual ways that programs are selected is via the PATH
(echo $PATH
on Linux and Mac) environment variable. You can always run a program with the full path e.g. /usr/bin/🔳 some args
, or cd /usr/bin
then ./🔳 some args
(replace blank with the ‘echo’ program I mentioned above for example), but otherwise typing 🔳 some args
has no meaning without PATH
env variable which declares the directories we implicitly may search-then-execute files from (if /usr/bin
was not in PATH
, then it would say 🔳: command not found
). The first matching command in the first directory is the one which is executed (the which
command on Linux and Mac will tell you which sub-path this is). Usually it is (e.g. on Linux, but similar on Mac) something like /usr/bin/python
which is a symlink to other symlinks to the final version somewhere, e.g.:
% echo $PATH
/usr/sbin:/usr/local/bin:/usr/sbin:usr/local/bin:/usr/bin:/bin
% which python
/usr/bin/python
% which python2
/usr/bin/python2
% ls -l /usr/bin/python
lrwxrwxrwx 1 root root 7 Mar 4 2019 /usr/bin/python -> python2*
% ls -l /usr/bin/python2
lrwxrwxrwx 1 root root 9 Mar 4 2019 /usr/bin/python2 -> python2.7*
% ls -l /usr/bin/python2.7
-rwxr-xr-x 1 root root 3689352 Oct 10 2019 /usr/bin/python2.7*
% which python3
/usr/bin/python3
% ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 9 Mar 26 2019 /usr/bin/python3 -> python3.7*
% ls -l /usr/bin/python3.7
-rwxr-xr-x 2 root root 4877888 Apr 2 2019 /usr/bin/python3.7*
% ls -l /usr/bin/python*
lrwxrwxrwx 1 root root 7 Mar 4 2019 /usr/bin/python -> python2*
lrwxrwxrwx 1 root root 9 Mar 4 2019 /usr/bin/python2 -> python2.7*
-rwxr-xr-x 1 root root 3689352 Oct 10 2019 /usr/bin/python2.7*
lrwxrwxrwx 1 root root 9 Mar 26 2019 /usr/bin/python3 -> python3.7*
-rwxr-xr-x 2 root root 4877888 Apr 2 2019 /usr/bin/python3.7*
lrwxrwxrwx 1 root root 33 Apr 2 2019 /usr/bin/python3.7-config -> x86_64-linux-gnu-python3.7-config*
-rwxr-xr-x 2 root root 4877888 Apr 2 2019 /usr/bin/python3.7m*
lrwxrwxrwx 1 root root 34 Apr 2 2019 /usr/bin/python3.7m-config -> x86_64-linux-gnu-python3.7m-config*
lrwxrwxrwx 1 root root 16 Mar 26 2019 /usr/bin/python3-config -> python3.7-config*
lrwxrwxrwx 1 root root 10 Mar 26 2019 /usr/bin/python3m -> python3.7m*
lrwxrwxrwx 1 root root 17 Mar 26 2019 /usr/bin/python3m-config -> python3.7m-config*
sidenote2: (In the rarer case a python program invokes a sub-program with the subprocess
module, to specify which program to run, one can modify the paths of subprocesses with sys.path
from the sys module or the PYTHONPATH
environment variable set on the parent, or specifying the full path… but since the path is inherited by child processes this is not remotely likely an issue.)
Последнее обновление: 16.12.2022
На одной рабочей машине одновременно может быть установлено несколько версий Python. Это бывает полезно, когда идет работа с некоторыми внешними библиотеками, которые поддерживают разные версии python, либо в силу каких-то
других причин нам надо использовать несколько разных версий. Например, на момент написания статьи последней и актуальной является версия Python 3.11.
Но, допустим, необходимо также установить версию 3.10, как в этом случае управлять отдельными версиями Python?
Windows
На странице загрузок https://www.python.org/downloads/ мы можем найти ссылку на нужную версию:
И также загрузить ее и установить:
Чтобы при использовании интерпретатора Python не прописывать к нему весь путь, добавим при установке его в переменные среды. Но здесь надо учитывать, что в переменных среды
может содержаться несколько путей к разным интерпретаторам Python:
Та версия Python, которая находится выше, будет версией по умолчанию. С помощью кнопки «Вверх» можно нужную нам версию переместить в начало, сделав версией по умолчанию.
Например, в моем случае это версия 3.11. Соответственно, если я введу в терминале команду
или
то консоль отобразит версию 3.11:
C:python>python --version Python 3.11.0
Для обращения к версии 3.10 (и всем другим версиям) необходимо использовать указывать номер версии:
C:python>py -3.10 --version Python 3.10.9
например, выполнение скрипта hello.py
с помощью версии 3.10:
Подобным образом можно вызывать и другие версии Python.
MacOS
На MacOS можно установить разные версии, например, загрузив с официального сайта пакет установщика для определенной версии.
Для обращения к определенной версии Python на MacOS указываем явным образом подверсию в формате python3.[номер_подверсии]
. Например, у меня установлена версия
Python 3.10. Проверим ее версию:
Аналогично обращении к версии python3.9
(при условии если она установлена)
К примеру выполнение скрипта hello.py
с помощью версии python 3.10:
Linux
На Linux также можно установить одновременно несколько версий Python. Например, установка версий 3.10 и 3.11:
sudo apt-get install python3.10 sudo apt-get install python3.11
Одна из версий является версий по умолчанию. И для обращения к ней достаточно прописать python3, например, проверим версию по умолчанию:
Для обращения к другим версиям надо указывать подверсию:
python3.10 --version python3.11 --version
Например, выполнение скрипта hello
с помощью версии Python 3.10:
Но может сложиться ситуация, когда нам надо изменить версию по умолчанию. В этом случае применяется команда update-alternatives для связывания
определенной версии Python с командой python3. Например, мы хотим установить в качестве версии по умолчанию Python 3.11. В этом случае последовательно выполним следующие команды:
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2
Числа справа указывают на приоритет/состояние. Так, для версии 3.11 указан больший приоритет, поэтому при обращении к python3
будет использоваться именно версия 3.11 (в моем случае это Python 3.11.0rc1)
С помощью команды
sudo update-alternatives --config python3
можно изменить версию по умолчанию
Одно из моих первых разочарований при разработке на Python не имело ничего общего с самим Python, а скорее с излишне изотерическими действиями по развертыванию приложений на Python. Учебные курсы и руководства отлично справляются с задачей обучения студентов запуску Python кода локально, но действительно стоящие приложения не запускают на локальных машинах: они работают на интернет серверах потому что именно в этом и есть их назначение, не так ли? Хотя может быть я высказал сумасшедшую идею.
Ubuntu 20.04 это первая LTS версия Ubuntu в которой отсутствует Python2 и которая поставляется из коробки с установленной версией Python 3.8.5. Но что если написанное вами приложение использующее более новую версию Python? Если вы, как и я, пытались заменить установленную по умолчанию в системе версию, то в процессе сломали вашу ОС. Если до этого вам никто не говорил не делать этого, тогда я возьму на себя эту честь: не делайте этого.
Итак, что же нам делать? Существует нескольок путей как обновить версию Python на Ubuntu, но использование вастроенного в Ubuntu’s механизма «alternative install» оптимально по нескольким причинам:
-
Мы хотим оставить нетронутойси стемную версию Python
-
По возможности не возиться с Python PATH
-
Мы можем удобно переключать активную версию Python с использованием CLI
Мы пройдемся по способу легкой и безопасной установки последней версии Python не затрагивая системную версию Python.
Скачивание последней версии Python
Первый шаг должен быть вам знаком: нам необходимо обновить зеркала Ubuntu и установленные пакеты, что бы быть уверенными что мы загружаем последние версии пакетов при установке чего-либо:
Обязательные обновления:
$ sudo apt update && sudo apt upgrade -y
Установка другой версии Python на Ubuntu трубует установки целого ряда зависимых библиотек для Python. Я честно гвооря не уверен что делает половина из этого, и скорее всего это никому из нас никогда не понадобится. Но поверьте, это необходимый шаг:
Установка зависимостей Python:
$ sudo apt-get install build-essential checkinstall
$ sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev
libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev
Именно здесь многие могут начать установку Python с помощью Ubuntu package manager командой apt-get install python3.X. Мы скачаем и соберем последнюю версию Python из исходные кодов по нескольким причинам. Если версия Python достаточно свежая, некоторые машины под управлением Ubuntu могут не иметь обновленных зеркал что бы получить последнюю версию, но важнее всего то, что этот способ позволяет упростить управление несколькими версиями Python на Ubuntu.
Последнюю версию Python всегда можно найти на официальной странице с релизами на Python.org:
Релизы исходных кодов Python
Первая ссылка на указанной странице должна называться Latest Python 3 Release — Python 3.X. Перейдя по ней необходимо прокрутить вниз страницы до секции «Files» и скопировать URL ссылки Gzipped source tarball.
На вашей Ubuntu машине необходимо теперь скачать эти исходные коды с помощью утилиты «wget». Ниже пример команд для скачивания заархивированной версии Python 3.9.2 в папку /opt и распаковка ее:
Скачивание Python:
$ cd /opt
$ sudo wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz
$ sudo tar xzf Python-3.9.2.tgz
Теперь последняя версия Python скачана. После этого нам остается ее установить… правильно.
Установка альтернативной версии Python из исходных кодов
Главное разочарование установки Python с использованием команды apt-get install python3.X
это что Python будет установлен нормально, но Ubuntu будет по прежнему использовать установленную в системе по умолчанию версию Python. К счастью для нас Ubuntu позволяет устанавливать нам дополнительные (альтернативные) версии Python с использованием команды make altinstall
:
Установка из исходных кодов:
$ cd Python-3.9.2
$ sudo ./configure —enable-optimizations
$ sudo make altinstall
Исполнение этих команд может занять некоторое время. После того, как команды будут выполнены вы можете увидеть python3.9 в вашей директории /usr/local/bin/
:
Проверка версии Python
$ cd /usr/local/bin/
$ ls
Итак, теперь у нас есть две установленные версии Python: установленная в системе по-умолчанию Python 3.8.5 и добавленная нами новая версия Python 3.9.2. Мы хотим оставить нетронутой установленную в системе версию по-умолчанию, но мы так же хотим запускать написанные нами приложения в версии Python 3.9… итак как мы можем этим управлять?
Linux предусматривает такой сценарий с помощью команды update-alternatives
. Мы можем сказать Ubuntu что у нас есть ветка с альтернативной версией на нашей машине, это предоставит нам возможность легко переключаться между ними. Вот как это работает:
Включение альтернативной версии Python
$ update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
$ update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.9 2
Мы запускаем update-alternatives
дважды: один раз для Python 3.8, и один раз для Python 3.9. Теперь мы можем использовать команду update-alternatives —list
что бы посмотреть все альтернативные версии какого-либо установленного ПО:
Список установленных версий Python
$ update-alternatives --list python3
/usr/bin/python3.6
/usr/local/bin/python3.8
Теперь мы можем переключаться между установленными версиями Python! Запустите следующую команду:
Переключение между версиями
$ update-alternatives --config python3
После выполнения команды вы должны получить подсказку как в приведенном ниже примере. Это будет список всех доступных версий Python в вашей системе. Выберите версию которую хотите использовать введя соответствующий номер версии указанный в колонке Selection
:
CLI для переключения активной версии Python
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/python3.8 3 auto mode
* 1 /usr/bin/python3.8 3 manual mode
2 /usr/local/bin/python3.10 2 manual mode
Press <enter> to keep the current choice[*], or type selection number:
И вы это сделали! Для переключения версии Python все что нужно — это ввести запрошенный номер версии Python указанный в колонке selection
.
Это прозвучит абсурдно, но изменить версию Python в Ubuntu ничего не сломав — это впечатляет. Я бы сказал что это в основном вина тех, кто преподаает Python. Если «учат те, кто не может сделать», то было бы логично предположить что Python преподают те, кто не запустил ни одного значимого проекта. Это было жестко, но не бейте меня нисмотря ни на что.
Мы закончили самую трудную часть, но осталось еще немного рутинной работы. Нам все еще нужно установить pip для нашей свежеустановленной версии Python, а так же обновить pip до последней версии.
Установка pip3
$ apt install python3-pip
$ python3.9 -m pip install --upgrade pip
Последний штрих
Вы наверняка заметили что Ubuntu 20.04 (и новее) заставляют нас явно указывать python3 при использовании Python несмотря на отсутствие Python 2 на машине. Это немного раздражает, но так же потенциально может сломать библиотеки которые пытаются использовать Python (NPM, sqlite и node-qyp например)
Возможно вы чувствуетет в себе достаточно сил что бы создать alias, который будет при обращении к python ссылаться на python3, но к сожалению это не будет работать так, как вам бы хотелось. Хорошая новость в том, что есть простое решение:
Скажите Ubuntu что python это python3
$ apt-get install python-is-python3
Да, есть целый пакет для Ubuntu созданный специально для решения этой задачи. Но это работает ¯_(ツ)_/¯.
В большинстве операционных систем 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
— утилита, которая позволяет
легко переключаться между несколькими версиями интерпретатора 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
Скрипт не требует прав суперпользователя (без
sudo
), потому что
всё устанавливается в домашнюю директорию пользователя. Туда же
будут устанавливаться и интерпретаторы. Если страшно запускать
какие-то скрипты из интернета (так и должно быть), то прочитать код скрипта можно
здесь. -
Настроим шелл.
Предыдущая команда перед завершением должна была напечатать инструкции
по настройке шелла. Допустим, в случае с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)
Кстати, горячо рекомендую попробовать
fish
, очень удобный шелл. -
Установим зависимости для сборки.
При установке новой версии интерпретатора через
pyenv
под капотом
происходит сборка из исходников, поэтому для успешной установки
необходимы некоторые зависимости. Полный и актуальный список
для своей ОС смотрите здесь
или здесь.
Лучше установить всё заранее. -
Перезапустим шелл и проверим установку.
$ 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
:
В директории появился файл .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
пересоздать их все заново:
И всё работает снова:
$ 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
.
Обложка: Schwoaze, Snakes Black Snakes Animal Free Photo
I am using Ubuntu 16.04 LTS . I have python3
installed. There are two versions installed, python 3.4.3
and python 3.6
. Whenever I use python3
command, it takes python 3.4.3
by default. I want to use python 3.6
with python3
.
python3 --version
shows version 3.4.3
I am installing ansible
which supports version > 3.5
. So, whenever, I type ansible in the terminal, it throws error because of python 3.4
sudo update-alternatives --config python3
update-alternatives: error: no alternatives for python3
GAD3R
61k30 gold badges126 silver badges189 bronze badges
asked Dec 13, 2017 at 9:13
8
From the comment:
sudo update-alternatives --config python
Will show you an error:
update-alternatives: error: no alternatives for python3
You need to update your update-alternatives
, then you will be able to set your default python version.
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.4 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
Then run :
sudo update-alternatives --config python
Set python3.6 as default.
Or use the following command to set python3.6 as default:
sudo update-alternatives --set python /usr/bin/python3.6
answered Dec 14, 2017 at 12:11
GAD3RGAD3R
61k30 gold badges126 silver badges189 bronze badges
14
You can achieve this by applying below simple steps —
-
Check python version on terminal:
python --version
-
Execute this command to switch to python 3.6:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
-
Check python version:
python --version
-
Done.
Kusalananda♦
307k35 gold badges598 silver badges896 bronze badges
answered Feb 2, 2019 at 9:37
Vineet JainVineet Jain
8036 silver badges2 bronze badges
2
if you have multiple version of python in your system. You just need to update the symbolic link of python inside /usr/bin/
root@irshad:/usr/bin# ls -lrth python*
lrwxrwxrwx 1 root root 9 Apr 16 2018 python -> python2.7
-rwxr-xr-x 1 root root 3.6M Nov 12 2018 python2.7
-rwxr-xr-x 2 root root 4.4M May 7 14:58 python3.6
In above example if you see the output of python --version
you will get python2.7
Now update the python symlink using below command-
root@irshad:/usr/bin# unlink python
root@irshad:/usr/bin# ln -s /usr/bin/python3.6 python
root@irshad:/usr/bin# python --version
Python 3.6.8
answered May 25, 2019 at 18:03
IRSHADIRSHAD
5375 silver badges3 bronze badges
3
Using these commands can help you:
- check the version of python:
ls /usr/bin/python*
- alias:
alias python='/usr/bin/pythonxx'
(add this to. ~/.bashrc
) - re-login or source
. ~/.bashrc
- check the python version again:
python --version
answered Nov 8, 2018 at 11:44
NewtNewt
3692 silver badges4 bronze badges
3
First check that you have a python3.6 folder?
ls /usr/bin/python3.6
If you have «python3.6» folder, you are good to go. Now update-alternatives
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
then update new config for python3
sudo update-alternatives --config python3
Finally, check default python3 version:
python3 --version
Stewart
11.1k1 gold badge36 silver badges67 bronze badges
answered May 21, 2019 at 10:29
mmblackmmblack
1471 silver badge4 bronze badges
3
Create symlink for /usr/bin/python3.
In my LinuxMint:
# ls -lh /usr/bin/python3 /usr/bin/python
lrwxrwxrwx 1 root root 9 ноя 24 2017 /usr/bin/python -> python2.7
lrwxrwxrwx 1 root root 9 сен 6 2017 /usr/bin/python3 -> python3.5
# mv /usr/bin/python /usr/bin/python.bak
# cp /usr/bin/python3 /usr/bin/python
# python --version
Python 3.5.2
answered Dec 4, 2018 at 11:13
1
An easy answer would be to add an alias for python3.6.
Just add this line in the file ~/.bashrc : alias python3="python3.6"
, then close your terminal and open a new one. Now when you type python3 xxx
it gets translated to python3.6 xxx
.
This solution fixes your problem without needing to tweak your system too heavily.
EDIT :
As Mikael Kjær pointed out, this is a misconfiguration of ansible with your system.
As seen here :
Set the
ansible_python_interpreter
configuration option to
/usr/bin/python3. The ansible_python_interpreter configuration option
is usually set per-host as an inventory variable associated with a
host or group of hosts:# Example inventory that makes an alias for localhost that uses python3 [py3-hosts] localhost-py3 ansible_host=localhost ansible_connection=local [py3-hosts:vars] ansible_python_interpreter=/usr/bin/python3
As seen here about the config file :
Changes can be made and used in a configuration file which will be processed in the following order:
* ANSIBLE_CONFIG (an environment variable) * ansible.cfg (in the current directory) * .ansible.cfg (in the home directory) * /etc/ansible/ansible.cfg
answered Dec 13, 2017 at 9:27
3
update-alternatives is to change system symlinks to user-defined/admin-defined symlinks.
If you have multiple versions of python3 installed in your system and want to control which python3 version to invoke when python3 is called. Do the following
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.4 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 2
Run below command if you want to change priority in the future.
update-alternatives --config python3
Explanation:-
sudo update-alternatives --install <symlink_origin> <name_of_config> <symlink_destination> <priority>
You can go on change name_of_config to python4, but then you have to invoke update-alternatives —config with python4 to reconfigure.
Using this approach you are able to control system python version and python3 version separately.
answered Mar 13, 2019 at 20:02
1
You can change the simbolic link by ln -sf python3.6 python3
inside /usr/bin
. With this when you call python3
it will execute python3.6
answered May 21, 2019 at 10:42
I guess most of us are aware of the fact that syntax in Python 2.x series are a little different than the Python 3.x series. Obviously, there can be a situation where you have to change the interpreter version for the program run. Especially when your IDE is Pycharm everything is quite easy. If you are looking for how to change the python version in PyCharm? I think this article is just for you.
Step 1 :
- Check if you already have that version interpreter of Python pre-installed. Suppose if you have Python 3.7 but you need a virtual env in pycharm for 2.7 base interpreter. In order to check it, Go to –
File -> Settings -> Project ->Project Interpreter
how to change python version in pycharm step 1
Refer to the above diagram, Here click on the drop-down of the Project Interpreter row ( Where the No Interpreter is mention). It will show you the name and path of the Interpreter which are already configured. All you need to select one of them if they are available at Run time Configuration in Pycharm ( Hint Run -> Edit Configurations).
Step 2:
In case the desire interpreter is not available. Go and install the required from https://www.python.org/downloads/
There is a dedicated tutorial on how to install python in you Opearting System. Follow the steps to install it.
Step 3 :
Set the path in the system variable. Especially while installing from Python.org window installer, It will show you the option to set the path automatically with the installation. In case you do not opt for it. Go and manually add it.
Step 4 :
Now once you have done to step 3, Restart the Pycharm and select the desired interpreter in Run -> Edit Configurations inside Pycharm IDE. Now you may use this global python interpreter for the project. But in case you want to create the virtual env based on this interpreter. You may go to File -> Settings -> Project ->Project Interpreter and click on the setting icon and choose to add.
Refer to the above image and change the base Interpreter here. Here you may choose the one which is the newest you installed. Here you may choose the conda env as the Interpreter also. It is just to make sure that pycharm is fully configurable with a variety of Interpreters.
How to downgrade python version in pycharm
In the above steps you have understood how to the edit configuration for the python interpreter. You can easily select the version of the python you want to to use or downgrade using it. This way you can easily downgrade python version in pycharm.
You can download the pycharm IDE from here.
Conclusion –
This is a generic way to deal with python versioning with pycharm. It will remain same in most of the platform or operating system like mac, Linux or Windows etc. Now next to it is pycharm exploration. Just like, there are some other important configurations with pycharm like increasing memory in Pycharm and Installing packages in pycharm which we understand as next step.
Thanks
Data Science Learner Team
Join our list
Subscribe to our mailing list and get interesting stuff and updates to your email inbox.
We respect your privacy and take protecting it seriously
Thank you for signup. A Confirmation Email has been sent to your Email Address.
Something went wrong.
Introduction
Every fresh Python release comes with bug fixes and new features. Python 3.9, the latest point release at the time of writing, comes with features such as improved time zone support, dictionary updates, and more flexible decorators.
This tutorial shows you how to upgrade Python to version 3.9 on all the major operating systems — Windows, macOS, and Linux.
Prerequisites
- Administrative rights on the operating system you are using.
- Knowledge of which Python version is currently on your system. If you need help finding out the version of your Python installation, check out How to Check Python Version.
Note: If you are upgrading from a Python 2 release and do not have Python 3 installed, read our comprehensive guides on how to install it on:
- Windows 10
- Ubuntu 20.04
- CentOS 8
Upgrading Python on Windows OS
To upgrade Python on Windows, download the installer or search for the app in the Microsoft Store.
Upgrade to Python 3 with the Installer
1. In your browser, visit the Python Releases for Windows section on the official Python website.
2. Click the Download Python button to download the installation file on your computer.
3. Next, run the Python installer. If you are upgrading from another point release of Python 3 (for example, 3.8.10), the installer suggests to install Python 3.9. Select Install Now to install Python with recommended options, or select Customize Installation to pick the install location and features.
If you already have an older version of the same Python release (for example, 3.9.1), the installer offers to upgrade your Python installation. Proceed by selecting Upgrade Now.
4. When the installation finishes, check whether the new version of Python has been installed successfully. Open Windows PowerShell and type:
python3 --version
The output should show the latest version of Python, as in the image below.
Install Python 3.9 from the Microsoft Store
If you want to use Python 3.9 to learn the basics or test some simple concepts, find and install the Python 3.9 app from the Microsoft Store.
1. Go to Microsoft Store and type Python in the search field.
2. Select Python 3.9 from the search results that appear.
3. Click the Get button to start the installation.
Start the interactive Python 3.9 experience by finding the app in the Start Menu.
Upgrading Python on macOS
On macOS, Python can be installed, upgraded, and maintained using the command line interface or the GUI.
Upgrade Python using Homebrew
Install Python in the macOS terminal using the Homebrew package manager. If you do not have Homebrew, install it by typing the following script in the terminal:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Then, proceed with the steps:
1. Update Homebrew by running:
brew update
2. If you are upgrading from Python 2, install Python 3 with the command:
brew install python3
If you already have a version of Python 3 installed, upgrade the package with the brew upgrade
command:
brew upgrade python3
Upgrade Python with the Installer
1. In your browser, navigate to the Python Releases for macOS page, on Python’s official website.
2. Click the link to download the latest Python 3 release on your computer.
3. Run the installer. Go through the installation steps by clicking Continue, agreeing to the License, and confirming the installation location and type.
4. Once the installation is complete, select Close.
5. Finally, confirm that the new Python version has been successfully installed by typing the following in terminal:
python3 --version
The output should display the latest version of Python.
Upgrading Python in Linux
This article uses Ubuntu and its APT package manager to upgrade Python. If you are using a different Linux distribution, replace the apt Linux command with the appropriate command featured for your package manager.
Warning: Many Linux systems have Python 2 installed as the system version. Removing Python 2 could cause a system error. If you are planning to install Python 3 on Linux, install it alongside Python 2 and invoke it with the python3
command.
1. Start by updating the repositories:
sudo apt update
2. Next, install Python 3.9 by running:
sudo apt install python3.9
When prompted, type Y to start the installation.
3. Once Python installs, invoke the 3.9 version by running:
python3.9
4. However, checking the installation with the python3 --version
command still returns the old version. To fix this, you need to create a list of update alternatives. First, add the old version to the list with the command:
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.[old-version] 1
5. Now add the new version:
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 2
6. Next, type the following command to configure the priority status of the versions:
sudo update-alternatives --config python3
The output displays the available choices and their assigned number (in the example below, the numbers are 0, 1, 2). Type the number of the the version you wish to use and press Enter.
7. If you are not planning to use the old version of Python, remove the symlink that contained the previous Python 3 version with:
sudo rm /usr/bin/python3
8. Then, replace the symlink with the new version:
sudo ln -s python3.9 /usr/bin/python3
9. Now, check the default version:
python3 --version
The output should confirm the successful installation and setup of the latest available version.
Why Should You Upgrade Python?
Since Python 3 was not a backward-compatible release, for a long time Python 2 remained the version of choice for those who wanted a stable development environment. Some services like Google App Engine did not support Python 3 for a long time.
However, given that the official support for the final Python 2.7 release has ended, upgrading to Python 3 is now strongly recommended. Python 3 is faster, and its syntax is more user-friendly.
If you already work with Python 3, upgrading to the latest point release gives you all the security updates and bug fixes.
Conclusion
After reading this tutorial, you should know how to upgrade your Python 3 version on Windows, macOS, and Linux. If you want to learn more about Python, read our article on Python data types.