Jak wykonać polecenie programu „python”, aby wykonać Python 3?

331

Polecenie pythonprogramu wykonuje Python 2. Python 3 można wykonać za pomocą python3polecenia. Jak można uruchomić Python 3 za pomocą pythonpolecenia?

Giri
źródło
30
Tylko ostrzeżenie: Nie próbuj zmieniać dowiązania symbolicznego / usr / bin / python, aby wskazywało na python3 zamiast 2.7. Wiele programów dostępnych w repozytoriach Ubuntu wymaga kompatybilności / usr / bin / python z python 2.x.
soulsource
1
Ach, teraz mam to, co miałeś na myśli mówiąc o aktualizacji ... Właściwie programiści Ubuntu nad tym pracują : wiki.ubuntu.com/Python/3 „Ubuntu 14.04 LTS ma na celu wydanie tylko Python 3 na płycie CD zdjęcia."
soulsource
1
Z drugiej strony, każdy, kto tu przyjeżdża, ponieważ próbuje dowiedzieć się, jak ustawić domyślny język Python 3, może zamiast tego znaleźć zastosowanie w badaniu środowisk wirtualnych (np. Virtualenv) lub kontenerów (np. LXC lub Docker).
Kevin
1
W odniesieniu do ostrzeżenia soulsource na górze patrz PEP 394, który standaryzuje konwencje nazewnictwa dla współistniejących plików wykonywalnych Pythona i na którym (i powinni) polegać programiści i opiekunowie pakietów.
David Foerster,
2
@wjandrea, tak, nawet w środowisku wirtualnym, pythonnależy zachować jako znaczenie python2. Miałem na myśli mój komentarz jako sposób na posiadanie wersji Pythona specyficznej dla aplikacji, zamiast próbować obejść Python w systemie.
Kevin,

Odpowiedzi:

370

Prostym bezpiecznym sposobem byłoby użycie aliasu. Umieść to w ~/.bashrclub ~/.bash_aliasesplik:

alias python=python3

Po dodaniu powyższego do pliku uruchom source ~/.bashrclub source ~/.bash_aliases.

Na przykład:

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

Aby obejść alias, użyj commandwbudowanego polecenia:

$ command python --version
Python 2.7.6

Innym sposobem obejścia aliasu jest użycie \przed poleceniem.

$ \python --version 
Python 2.7.6

Aby wyłączyć alias w bieżącej powłoce, użyj unaliaswbudowanego polecenia:

$ unalias python
$ python --version
Python 2.7.6
Radu Rădeanu
źródło
1
więc nie ma opcji „upgrade” .. ??
Giri
4
tak naprawdę chcę wyczyścić wersję 2.7 i zastąpić ją wersją 3.3. Na razie wydaje się, że to zły pomysł ...
Giri
35
+1 nie ma powodu, aby wyczyścić 2.7, aby móc pracować z 3.3. Ponieważ wiele programów nadal zależy od wersji 2.7; po prostu nie przestawaj.
don.joey
6
@begueradj Alias różni się całkowicie od dowiązania symbolicznego .
Radu Rădeanu
1
Uwaga: może to uszkodzić inne skrypty oczekujące Pythona 2.7.
kmiklas
85

[Czerwiec 2016 r.] Zalecanym miejscem informacji o przejściu jest oficjalna strona Ubuntu Python .


Z wiki Ubuntu :

Zarówno dla Ubuntu, jak i Debiana, mamy stałe cele projektu, aby uczynić Python 3 domyślną, preferowaną wersją Pythona w dystrybucjach.

Co to nie znaczy:

  • /usr/bin/pythonwskaże Python 3. Nie, tak się nie stanie (chyba że PEP 394 opowiada się inaczej, co jest wątpliwe w dającej się przewidzieć przyszłości). /usr/bin/pythoni /usr/bin/python2będzie wskazywać na Python 2.7 i /usr/bin/python3będzie wskazywać najnowszą obsługiwaną wersję Python 3.

  • Python 2 zostanie usunięty z archiwum. Nie, tak się nie stanie . Oczekujemy, że Python 2.7 pozostanie obsługiwany i dostępny w Ubuntu przez dość długi czas, biorąc pod uwagę, że PEP 373 obiecuje wsparcie w zakresie naprawy błędów do 2020 roku.

Nie jest zalecane zmienianie dowiązania symbolicznego z powodu innych zależności pakietów, ale „mają stałe cele projektu, aby uczynić Python 3 domyślną, preferowaną wersją Pythona w dystrybucji”.


Do użytku CLI, jak @Radu Rădeanu , polecam umieszczenie aliasu w instrukcji ~/.bashrc, .bash_aliasespliku (różne pliki, w tym ~/.bash_profilesą ładowane przynajmniej raz, są głównie do celów organizacyjnych, ale mogą się różnić od platformy). Środowiska wirtualne Python również działają dobrze.

Przykłady aliasów:

alias python=python3

lub

alias python='/usr/bin/python3'

Skrypty powinny nadal używać czegoś takiego jak #!/usr/bin/env python3dla kompatybilności krzyżowej.

Używanie envjest przydatne do mieszanego użytkowania w środowiskach wirtualnych.

Uwaga (dzięki @wjandrea): aliasy są częścią środowiska wykonawczego bash, a nie środowiskiem użytkownika. Dlatego nie są one dostępne dla shebang ( #!). Jeśli wolisz alias python = python3, to niektóre program.pybez shebang mogą być wykonane przez wywołanie takiego aliasu interpretera python program.py. Aliasing może być również przydatny w systemach z wieloma wersjami Python3, takich jak 3.4 i 3.6.

Kevin
źródło
1
To wydaje się być nieaktualne: planowali usunąć python2 w Xenial, ale potem tego nie zrobili.
OrangeDog,
1
@OrangeDog, dzięki za aktualizację. Tak, strona wiki, którą cytowałem, jest teraz oznaczona jako nieaktualna, ponieważ w ciągu ostatnich dwóch lat dokonano większego postępu w przejściu tylko na Python 3. Nową stroną śledzącą ten postęp jest oficjalna strona Ubuntu Python .
Kevin,
Strona „najnowsza” również jest nieaktualna, jeśli chodzi o plany Xenial.
OrangeDog,
Nie powiedziałbym, że jest „nieaktualny” tak bardzo, jak „nie był ostatnio aktualizowany”. Nadal wydaje się, że jest to bieżąca lokalizacja przechowywania postów na ten temat. Jednak w komentarzach tutaj byłbym wdzięczny za wszelkie inne niedawne źródła, które każdy może znaleźć. Dodanie większej liczby źródeł do mojej odpowiedzi, dlaczego nie wprowadzić zmiany na just python, nie jest tak naprawdę istotne, dopóki konwersja nie zostanie zakończona. Nawet wtedy może to po prostu stać się problemem.
Kevin,
2
Aliasy są wewnętrzne dla Bash, nie są częścią środowiska, więc nadal będziesz musiał używać python3w shebang, nie python.
wjandrea
28

Aktualizacja: dowiedziałem się, że jest to niewłaściwy sposób, ponieważ Python2 i Python3 nie są wymienne.

Możesz wypróbować narzędzie wiersza poleceń update-alternatives.

$ sudo update-alternatives --config python

Jeśli pojawi się błąd „nie ma alternatywy dla Pythona”, należy samodzielnie ustawić alternatywę za pomocą następującego polecenia:

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

Zmień odpowiednio ścieżkę /usr/bin/python3na żądaną wersję Pythona.

webwurst
źródło
19
python2 i python3 nie są alternatywami. Nie używaj do tego alternatyw aktualizacji.
jobin
Dlaczego nie są Czy ktoś z was może wyjaśnić, dlaczego update-alternativesnie nadaje się do Pythona? Czy to z powodu legacy.python.org/dev/peps/pep-0394 ?
Dmitrij Grigoryev,
11
alternatywami są różne implementacje dla tych samych funkcjonalności. python2 i python3 nie zapewniają tych samych funkcji.
Ely,
Możesz zrobić coś takiego, jeśli ręcznie zainstalowałeś (za pomocą ppa lub cokolwiek) inne wersje python3. sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
David Baucum,
To właśnie musiałem zrobić dla 18.04.2 VM, która nie jest dostarczana z Pythonem. Dzięki
Dark Star1,
9

Ubuntu i pozostałe dystrybucje Linuksa są nadal w dużej mierze zależne od Pythona 2.7 dla szeregu aplikacji i poleceń. Jeśli zmienisz domyślne odniesienie „python” na Python 3.x, wówczas szereg funkcji Python zacznie generować błędy asercji.

Na przykład w systemie Ubuntu „pip” dla jednego z nich nie działałby już poprawnie, chyba że bezpośrednio edytowałeś plik i zmieniłeś shebang na „#! / Usr / bin / env python2.7”. W wersjach RHEL (Red Hat Enterprise Linux), takich jak Red Hat, Fedora i CentOS, polecenie „Yum” jest również zależne od Pythona 2.7.

Chodzi mi o to, że spowodowałbyś, że znaczna ilość kodu zacząłaby generować błędy asercji, abyś mógł wpisać „python” w terminalu, aby odwoływał się do Pythona 3.x.

O wiele lepiej jest użyć polecenia „python3” w terminalu i shebang „#! / Usr / bin / env python3” w plikach Python 3.x.

Lunatyk
źródło
2

Zrobić

cd ~
gedit .bash_aliases

następnie napisz albo

alias python=python3

lub

alias python='/usr/bin/python3'

Zapisz plik, zamknij terminal i otwórz go ponownie.
Połączyć

Bryza
źródło
1

Można podlinkowujemy /usr/bin/pythonsię python3z

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

i możesz zapobiec instalacji Pythona 2 i pip2 jako zależności od

sudo apt-mark hold python python-pip

Zobacz inne odpowiedzi, dlaczego możesz tego nie chcieć. Ubuntu 18.04+ nie jest już wyposażony w Python 2, więc nie powinno być tak źle.

Boris
źródło
2
Odnośnie „Ubuntu 18.04 nie jest już dostarczane z Python 2, więc nie powinno być tak źle”. , w systemie Ubuntu (nawet w wersjach, które domyślnie nie mają zainstalowanego Pythona 2) pythonzakłada się , że wywoływanym jest Python 2, więc może to popsuć niektóre rzeczy.
wjandrea
* python->/usr/bin/python
wjandrea
0
cat > /usr/local/bin/py
#!/bin/dash
python3 "$@"
<CTRL-D>

(pod warunkiem, że masz uprawnienia do zapisu w / usr / local / bin)

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

wtedy wpisujesz py (i używasz py w #! linii) dla wybranego pythona.

John Allsup
źródło
Czy nie byłoby łatwiej użyć dowiązania symbolicznego? sudo ln -s /usr/bin/python3 /usr/local/bin/py
wjandrea
0

Uważam, że bardzo pomocne jest po prostu usunięcie / usr / bin / python i / usr / bin / pip. Zmusza to wszystkie programy do polegania na poleceniach „python2” i „python3”.

Chociaż niektóre opcjonalne i nieaktualne pakiety zależą od #!/usr/bin/pythonpracy, wolę przesyłać łaty do tych programów, niż nadal popełniam dziwne, a czasem trudne do debugowania błędy.

Erik Aronesty
źródło
-1

Można użyć tej opcji, update-alternativesaby dostarczyć różne wersje programów, które mogą być potrzebne w różnych momentach z powodu problemów ze zgodnością.

Ta odpowiedź jest dobrym przykładem na to, jak skonfigurować rzeczy do jednoczesnego utrzymywania różnych wersji gcc / g ++, na przykład.

po prostu zrób to samo z python2.7 i python 3.3

dcanelhas
źródło
2
Początkujący użytkownicy mogą nie być w stanie łatwo dopasować połączonej odpowiedzi do innej sytuacji. Oprócz podania wcześniejszej odpowiedzi dobrze byłoby określić kroki niezbędne dla Pythona.
chaskes 18.10.13
Oto dobre rozwiązanie krok po kroku linuxconfig.org/…
woto
Python 2 i 3 nie są alternatywami - nawet różne pomniejsze wersje nie są ( np .). Ta metoda może łatwo zepsuć wszystko.
wjandrea
Jest to także duplikat tej odpowiedzi
wjandrea