Как заставить программную команду 'python' выполнить Python 3?

331

Команда pythonпрограммы выполняет Python 2. Python 3 может быть выполнен с помощью python3команды. Как Python 3 может быть выполнен с помощью pythonкоманды?

Гири
источник
30
Просто предупреждение: не пытайтесь изменить символическую ссылку / usr / bin / python, чтобы она указывала на python3 вместо 2.7. Многие программы, доступные в репозиториях Ubuntu, требуют, чтобы / usr / bin / python был совместим с python 2.x.
soulsource
1
Ах, теперь я понял, что вы имели в виду под обновлением ... На самом деле, над этим работают разработчики Ubuntu: wiki.ubuntu.com/Python/3 "Цель релиза Ubuntu 14.04 LTS - иметь только Python 3 на настольном CD картинки."
soulsource
1
С другой стороны, любой, кто приезжает сюда, потому что он пытается узнать, как сделать Python 3 по умолчанию, может вместо этого найти применение для исследования виртуальных сред (например, virtualenv) или контейнеров (например, LXC или Docker).
Кевин
1
В отношении предупреждения soulsource вверху см. PEP 394, который стандартизирует соглашения об именах для сосуществующих исполняемых файлов Python и на которые надеются (и должны) программисты Python и разработчики пакетов.
Дэвид Фёрстер
2
@wjandrea, да, даже в виртуальной среде, pythonследует понимать как значение python2. Я имел в виду мой комментарий как способ получить версию Python для конкретного приложения вместо того, чтобы пытаться обойти системный Python.
Кевин

Ответы:

370

Простой безопасный способ - использовать псевдоним. Поместите это в ~/.bashrcили ~/.bash_aliasesфайл:

alias python=python3

После добавления вышеуказанного в файл, запустите source ~/.bashrcили source ~/.bash_aliases.

Например:

$ python --version
Python 2.7.6
$ python3 --version
Python 3.4.3
$ alias python=python3
$ python --version
Python 3.4.3

Чтобы обойти псевдоним, используйте commandвстроенную команду:

$ command python --version
Python 2.7.6

Еще один способ обойти псевдоним - использовать \перед командой.

$ \python --version 
Python 2.7.6

Чтобы отключить псевдоним в текущей оболочке, используйте unaliasвстроенную команду:

$ unalias python
$ python --version
Python 2.7.6
Раду Рэдяну
источник
1
так что нет "обновления" вариант .. ??
Гири
4
на самом деле я хочу стереть 2.7 и заменить его на 3.3. Похоже, это плохая идея на данный момент ..
Гири
35
+1 нет смысла очищать 2.7, чтобы можно было работать с 3.3. Как много программного обеспечения по-прежнему зависит от 2,7; просто продолжай это делать.
don.joey
6
@begueradj Псевдоним полностью отличается от символической ссылки .
Раду Радеану
1
Предостережение: это может сломать другие скрипты, которые ожидают Python 2.7.
kmiklas
85

[Июнь 2016] Рекомендуемое место для информации о переходе - официальная страница Ubuntu Python .


Из вики Ubuntu :

И для Ubuntu, и для Debian у нас есть постоянные цели проекта, чтобы сделать Python 3 стандартной версией Python в дистрибутивах.

Что это не значит:

  • /usr/bin/pythonбудет указывать на Python 3. Нет, этого не произойдет (если PEP 394 не отстаивает иное, что сомнительно в обозримом будущем). /usr/bin/pythonи /usr/bin/python2будет указывать на Python 2.7 и /usr/bin/python3будет указывать на последнюю поддерживаемую версию Python 3.

  • Python 2 будет удален из архива. Нет, этого не произойдет . Мы ожидаем, что Python 2.7 останется поддерживаемым и доступным в Ubuntu в течение достаточно долгого времени, учитывая, что PEP 373 обещает поддержку обслуживания исправлений ошибок до 2020 года.

Не рекомендуется менять символическую ссылку из-за других зависимостей пакетов, но у них «есть постоянные цели проекта, чтобы сделать Python 3 стандартной, предпочтительной версией Python в дистрибутивах».


Для использования CLI, как @Radu Rădeanu , я бы рекомендовал поставить псевдоним в пользователя ~/.bashrc, .bash_aliasesфайл (различные файлы, в том числе ~/.bash_profile, загружаются по крайней мере один раз, в основном для организационных целей, но может варьироваться в зависимости от платформы). Виртуальные среды Python также хорошо работают.

Примеры псевдонимов:

alias python=python3

или же

alias python='/usr/bin/python3'

Скрипты все еще должны использовать что-то вроде #!/usr/bin/env python3для кросс-совместимости.

Использование envудобно для смешанного использования с виртуальными средами.

Примечание (спасибо @wjandrea): псевдонимы являются частью среды выполнения bash, а не пользовательской среды. Поэтому они не доступны для Шебанга ( #!). Если вы предпочитаете псевдоним python = python3, то некоторые из них program.pyбез шебанга могут быть выполнены, вызвав такой псевдоним интерпретатора, как этот python program.py. Псевдоним также может быть полезен для систем с несколькими версиями python3, такими как 3.4 и 3.6, вместе.

Kevin
источник
1
Похоже, это устарело: они планировали удалить python2 в Xenial, но не сделали этого.
OrangeDog
1
@OrangeDog, спасибо за обновление. Да, вики-страница, которую я цитировал, теперь помечена как устаревшая, так как за последние два года был достигнут больший прогресс в переходе только на Python 3. Новая страница, которая следует за этим прогрессом, является официальной страницей Ubuntu Python .
Кевин
«Последняя» страница также устарела относительно планов Xenial.
OrangeDog
Я бы не сказал, что он «устарел» настолько, насколько «он недавно не обновлялся». Похоже, это текущее место для хранения сообщений об этом. Однако, в комментариях здесь, я был бы признателен за любые другие недавние источники, которые кто-либо может найти. Добавление большего количества источников к моему ответу о том, почему бы не внести изменения в just python, на самом деле не имеет значения, пока преобразование не будет завершено. Даже тогда это может стать просто проблемой.
Кевин
2
Псевдонимы являются внутренними для Bash, а не частью среды, поэтому вам все равно придется использовать их python3в шебанге, а не в них python.
wjandrea
28

Обновление: я понял, что это неправильный путь, поскольку Python2 и Python3 не являются взаимозаменяемыми.

Вы можете попробовать инструмент командной строки update-alternatives.

$ sudo update-alternatives --config python

Если вы получаете сообщение об ошибке «нет альтернативы для python», то создайте альтернативу самостоятельно с помощью следующей команды:

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

Измените путь /usr/bin/python3к желаемой версии Python соответственно.

webwurst
источник
20
python2 и python3 не являются альтернативами. Не используйте для этого альтернативы обновления.
Jobin
Почему нет? Кто-нибудь из вас может объяснить, почему update-alternativesон не подходит для Python? Это из-за legacy.python.org/dev/peps/pep-0394 ?
Дмитрий Григорьев
11
альтернативами являются разные реализации для одних и тех же функций. python2 и python3 не предоставляют одинаковые функции.
Ely
Вы можете сделать что-то подобное, если вы вручную установили (через ppa или любую другую) другие версии python3. sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
Дэвид Баукум
Это то, что мне нужно было сделать для 18.04.2 vm, который не поставляется с python. Спасибо
Dark Star1
9

Ubuntu и остальные дистрибутивы Linux по-прежнему во многом зависят от Python 2.7 для ряда приложений и команд. Если вы измените ссылку по умолчанию «python» на Python 3.x, то ряд функций Python начнет выдавать ошибки утверждения.

Например, в Ubuntu «pip» для одного больше не будет работать правильно, если вы не отредактируете файл напрямую и не измените shebang на «#! / Usr / bin / env python2.7». В RHEL (Red Hat Enterprise Linux), таких как Red Hat, Fedora и CentOS, команда 'Yum' также зависит от Python 2.7.

Я хочу сказать, что вы заставили бы значительный объем кода начать выдавать ошибки утверждения, чтобы вы могли набрать «python» в терминале для ссылки на Python 3.x.

Вам гораздо лучше использовать команду «python3» в терминале и «#! / Usr / bin / env python3» в файлах Python 3.x.

подвыпивший
источник
2

Делать

cd ~
gedit .bash_aliases

тогда напиши либо

alias python=python3

или же

alias python='/usr/bin/python3'

Сохраните файл, закройте терминал и снова откройте его.
Ссылка

Ветер
источник
1

Вы можете симлинку /usr/bin/pythonк python3с

sudo ln -s /usr/bin/python3 /usr/bin/python

и вы можете предотвратить установку Python 2 и pip2 в качестве зависимости с

sudo apt-mark hold python python-pip

Посмотрите другие ответы о том, почему вы не хотите этого делать. Ubuntu 18.04+ больше не поставляется с Python 2, поэтому он не должен быть слишком плохим.

Борис
источник
2
Что касается «Ubuntu 18.04 больше не поставляется с Python 2, так что он не должен быть слишком плохим». в Ubuntu (даже в версиях, в которых Python 2 не установлен по умолчанию), предполагается, что исполняемый файл называется pythonPython 2, поэтому это может сломать некоторые вещи.
августа
* python->/usr/bin/python
wjandrea
0
cat > /usr/local/bin/py
#!/bin/dash
python3 "$@"
<CTRL-D>

(если у вас есть разрешение на запись в / usr / local / bin)

cat > /usr/local/bin/pyi
#!/bin/dash
python3 -i "$@"
<CTRL-D>

тогда вы только набираете py (и используете py в #! lines) для выбранного вами питона.

Джон Аллсуп
источник
Не проще ли использовать символическую ссылку? sudo ln -s /usr/bin/python3 /usr/local/bin/py
wjandrea
0

Я считаю очень полезным просто удалить / usr / bin / python и / usr / bin / pip. Это заставляет все программы полагаться на команды "python2" и "python3".

Хотя некоторые необязательные и устаревшие пакеты зависят от #!/usr/bin/pythonработы, я бы предпочел отправлять исправления этим программам, чем продолжать делать странные, а иногда и трудно исправляемые ошибки.

Эрик Аронесты
источник
-1

Вы можете использовать update-alternativesдля предоставления разных версий программ, которые могут понадобиться в разное время из-за проблем совместимости.

Этот ответ является хорошим примером того, как настроить, например, одновременное обслуживание разных версий gcc / g ++.

просто сделайте то же самое с python2.7 и python 3.3

dcanelhas
источник
2
Начинающие пользователи, возможно, не смогут легко адаптировать связанный ответ к другой ситуации. В дополнение к перечислению более раннего ответа, было бы хорошо изложить шаги, необходимые для Python.
Часов
Вот я нашел хорошее пошаговое решение linuxconfig.org/…
woto
Python 2 и 3 не являются альтернативами - даже разные минорные версии - нет ( например ). Этот метод может легко сломать вещи.
августа
Также это дубликат этого ответа
wjandrea