Як змусити команду програми "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 образи. "
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 Псевдонім абсолютно відрізняється від символічного посилання .
Radu Rădeanu

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, а не середовищем користувача. Тому вони не доступні для shebang ( #!). Якщо ви віддаєте перевагу псевдонім python = python3, то деякі program.pyбез shebang можуть бути виконані шляхом виклику подібного інтерпретатора python program.py. Згладжування також може бути корисним для систем з декількома версіями python3, як 3.4 та 3.6 разом.


1
Здається, це вже застаріло: вони планували видалити python2 у Xenial, але потім цього не зробили.
OrangeDog

1
@ OrangeDog, дякую за оновлення. Так, вікі-сторінка, яку я цитував, зараз позначена як застаріла, оскільки за останні два роки було досягнуто більшого прогресу для переходу на лише Python 3. Нова сторінка, яка слідкує за цим прогресом, - це офіційна сторінка Ubuntu Python .
Кевін

"Остання" сторінка також застаріла, щодо планів на Xenial.
OrangeDog

Я б не сказав, що він "застарів" настільки, наскільки "він нещодавно не оновлювався". Це все ще здається поточним місцем для зберігання повідомлень про це. Однак у коментарях, які я тут, я вдячний за будь-які інші останні джерела, які хтось може знайти. Додавання більшої кількості джерел до моєї відповіді про те, чому б не здійснити зміну на справедливе python, насправді не актуально до завершення конверсії. Навіть тоді це може просто стати проблемою.
Кевін

2
Псевдоніми є внутрішніми для Баша, не є частиною навколишнього середовища, тому вам все одно доведеться використовувати 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до потрібної версії пітона.


19
python2 та python3 не є альтернативами. Не використовуйте для цього альтернативи оновлення.
приєднатися

Чому їх немає? Чи можете хтось із вас пояснити, чому update-alternativesвін не підходить для python? Це через legacy.python.org/dev/peps/pep-0394 ?
Дмитро Григор’єв

11
альтернативи - це різні реалізації для однакових функцій. python2 та python3 не забезпечують однакових функцій.
Елі

Ви можете зробити щось подібне, якщо ви вручну встановили (через ppa чи будь-яку іншу) інші версії python3. sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
Девід Баукум

Це мені потрібно було зробити для 18.04.2 vm, який не постачається з python. Спасибі
Темна зірка1

9

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

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

Моя думка тут полягає в тому, що ви викликаєте значну кількість коду, щоб почати викидати помилки твердження лише для того, щоб ви могли ввести "python" в терміналі для посилання на Python 3.x.

Вам набагато краще використовувати команду 'python3' в терміналі і shebang '#! / 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, тому це може порушити деякі речі.
wjandrea

* 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 в #! рядках) для обраного пітона.


Чи не було б простіше використовувати символьне посилання? 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


2
Початкові користувачі можуть не в змозі легко адаптувати пов'язану відповідь до іншої ситуації. Окрім кредитування попередньої відповіді, було б добре викласти кроки, необхідні для Python.
chaskes

Ось я знайшов хороший крок за кроком рішення linuxconfig.org / ...
woto

Python 2 і 3 не є альтернативними - навіть різні другорядні версії не є ( наприклад ). Цей метод може легко зламати речі.
wjandrea

Також це дублікат цієї відповіді
wjandrea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.