Dwie wersje Pythona w systemie Linux. jak ustawić 2.7 jako domyślny

124

Mam dwie wersje Pythona na moim Linuksie:

$python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 


$ /usr/local/bin/python2.7
Python 2.7.3 (default, Oct  8 2013, 15:53:09) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

$ which python
/usr/bin/python
$ ls -al /usr/bin/python
-rwxr-xr-x. 2 root root 4864 Jul 10 22:49 /usr/bin/python

Jak mogę ustawić wersję 2.7 jako domyślną, aby po wpisaniu pythonznalazła się w wersji 2.7?

Anthony
źródło
1
Kiedy zrobiłem to w mojej fedorze, yum lub apt-get już nie działały.
Użytkownik
@User: Tak, podobnie złamałem starożytnego Mandragora (zmiana /usr/bin/env pythonna 2,6 zamiast 2,3 oznaczała, że ​​połowa poleceń rpmi wszystkie urpmiprzestały działać).
abarnert
Wykonałem następujący krok, aby zainstalować Django na Centos 5: 1., zainstaluj Python 3.6 z kodu źródłowego. 2nd: w powłoce wpisz następujące polecenie "alias python = / usr / local / bin / python3.6" 3.: uruchom następujące polecenie, aby zainstalować Django "pip3 install Django" 4.: "python -m django --version", aby sprawdzić Django zostało zainstalowane z wersją "1.10.5"
showmyroutes
dla mnie /usr/bin/pythonbyło miękkim linkiem wskazującym python2. Właśnie zmieniłem to napython3.6
munish

Odpowiedzi:

173

Prawdopodobnie nie chcesz zmieniać domyślnego Pythona.

Twoja dystrybucja zainstalowała standardowy system Python w /usr/bini może mieć skrypty zależne od tego, które są obecne i wybrane przez #! /usr/bin/env python. Można zazwyczaj uciec z systemem skryptów w Pythonie 2.6 2.7, ale chcesz ryzykować?

Co więcej, małpowanie z użyciem /usr/binmoże zepsuć zdolność menedżera pakietów do zarządzania pakietami. A zmiana kolejności katalogów w twoim PATHwpłynie na wiele innych rzeczy poza Pythonem. (W rzeczywistości bardziej powszechne jest posiadanie /usr/local/binprzewagi /usr/bini może to być to, czego naprawdę chcesz - ale jeśli masz to na odwrót, prawdopodobnie jest ku temu dobry powód).

Ale nie musisz zmieniać domyślnego Pythona, aby system działał w wersji 2.7 podczas wpisywania python.


Najpierw możesz ustawić alias powłoki:

alias python=/usr/local/bin/python2.7

Typ, który w sposób szybki, lub umieścić go w ~/.bashrcjeśli chcesz zmiana będzie trwała, a teraz, kiedy jesteś wpisać pythonbiegnie wybranym 2,7, ale kiedy jakiś program na swoich prób systemowych aby uruchomić skrypt /usr/bin/env pythondziała standardowej 2.6.


Alternatywnie, po prostu stwórz wirtualne środowisko z twojego 2.7 (lub oddzielne venv dla różnych projektów) i wykonaj swoją pracę wewnątrz venv.

abarnert
źródło
1
:( masz rację. niestety utworzyłem już nowy link symboliczny zgodnie z odpowiedzią @ rohit. Teraz moje yumpolecenie nie działa! Próbowałem utworzyć łącze symboliczne z powrotem, ale nie działa to sudo ln -sf /usr/bin/python2.6 /usr/bin/pythonżadne obejście?
Anthony
@Anthony: Domyślam się, że wcześniej /usr/bin/pythonnie był to link symboliczny, był to skrypt opakowujący lub plik wykonywalny, a teraz nadpisałeś go i nie możesz go odzyskać. Jeśli rpmnadal działa, możesz ręcznie pobrać pakiet Pythona i zainstalować go bez yum.
abarnert
Nadal mogę dostać się do interpretera 2.6, kiedy piszę, python2.6więc nadal tam jest.
Anthony
7
@Anthony: A w przyszłości, jeśli ktoś każe ci zmienić rzeczy w / usr / bin (lub gdziekolwiek w / usr poza / usr / local), zanotuj, co tam jest i kopię zapasową…
abarnert
w jaki zły bałagan wpadłem !! Mam inne pudełko centów, które może mieć ten skrypt. Jeśli skopiuję to stamtąd i umieszczę w / usr / bin tego pudełka. myślisz, że to zadziała?
Anthony
19

Dodaj /usr/local/bindo swojej PATHzmiennej środowiskowej, wcześniej na liście niż /usr/bin.

Generalnie jest to zrobione w pliku rc twojej powłoki, np. Dla bash, umieścisz to w .bashrc:

export PATH="/usr/local/bin:$PATH"

Spowoduje to, że twoja powłoka spojrzeć najpierw na pythonIN /usr/local/bin, zanim przejdzie z jednego w /usr/bin.

(Oczywiście oznacza to, że musisz również mieć /usr/local/bin/pythonpunkt python2.7- jeśli jeszcze tego nie zrobił, musisz utworzyć dowiązanie symboliczne).

Bursztyn
źródło
Ewentualnie może być konieczne odpowiednie ustawienie PYTHONHOME / rozbrojenie go, jeśli jest przez coś ustawione.
Marcin
1
Nie jest to tak niebezpieczne, jak rozwiązania sugerujące zmianę samego / usr / bin… ale nadal uważam, że nie jest to tym, czego chce OP.
abarnert
Pomogło mi to po aktualizacji z Ubuntu 14.x do 16.x
learn2day
4

Wprowadź polecenie

which python

//output:
/usr/bin/python

cd /usr/bin
ls -l

Tutaj możesz zobaczyć coś takiego

lrwxrwxrwx 1 root   root            9 Mar  7 17:04  python -> python2.7

Twój domyślny python2.7 jest miękko powiązany z tekstem „python”

Usuń więc pythona z łączem miękkim

sudo rm -r python

następnie ponów powyższe polecenie

ls -l

widać, że link programowy został usunięty

-rwxr-xr-x 1 root   root      3670448 Nov 12 20:01  python2.7

Następnie utwórz nowe łącze programowe dla Pythona3.6

ln -s /usr/bin/python3.6 python

Następnie wypróbuj polecenie pythonw terminalu

//output:
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux

Wpisz help, copyright, creditslub license, aby uzyskać więcej informacji.

Sreenath
źródło
1
Twój post nie jest odpowiedzią na pytanie OP.
Frank,
To rozwiązało dla mnie bardzo dziwny problem. Kiedy sprawdzam wersję Pythona z poziomu głównego lub normalnego terminala, pokazało się 3.6.8, ale jeśli utworzę .sh i wpiszę python -version w środku, wyświetli się 2.7. Okazuje się, że było to spowodowane istnieniem miękkiego łącza, jak wspomniano powyżej. Postępowałem zgodnie z instrukcjami i zostało to naprawione. Dzięki.
S4nd33p
Dziękuję Ci! To rozwiązało problem z „wymaganym
pythonem
4

Sprawdź aktualną wersję Pythona przez:

$ python --version

następnie sprawdź, czy python jest dowiązaniem symbolicznym do którego pliku.

  $ ll /usr/bin/python

Wyjście Ex:

 lrwxrwxrwx 1 root root 9 Jun 16  2014 /usr/bin/python -> python2.7*

Sprawdź inne dostępne wersje Pythona:

$ ls /usr/bin/python*

Wyjście Ex:

/usr/bin/python     /usr/bin/python2.7-config  /usr/bin/python3.4         /usr/bin/python3.4m-config  /usr/bin/python3.6m         /usr/bin/python3m
/usr/bin/python2    /usr/bin/python2-config    /usr/bin/python3.4-config  /usr/bin/python3.6          /usr/bin/python3.6m-config  /usr/bin/python3m-config
/usr/bin/python2.7  /usr/bin/python3           /usr/bin/python3.4m        /usr/bin/python3.6-config   /usr/bin/python3-config     /usr/bin/python-config

Jeśli chcesz zmienić obecną wersję Pythona na wersję 3.6, edytuj plik ~ / .bashrc:

vim ~/.bashrc

dodaj poniższą linię na końcu pliku i zapisz:

alias python=/usr/local/bin/python3.6

Aby zainstalować pip dla Pythona 3.6

$ sudo apt-get install python3.6 python3.6-dev
$ sudo curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python3.6
$ sudo easy_install pip

W przypadku sukcesu sprawdź aktualną wersję pip:

$ pip3 -V

Wyjście Ex:

pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.6)
Shiv Buyya
źródło
2

Wszystkie systemy operacyjne są dostarczane z domyślną wersją Pythona i znajdują się w / usr / bin. Wszystkie skrypty dostarczane z systemem operacyjnym (np. Yum) wskazują, że ta wersja Pythona znajduje się w / usr / bin. Kiedy chcesz zainstalować nową wersję Pythona, nie chcesz przerywać istniejących skryptów, które mogą nie działać z nową wersją Pythona.

Właściwym sposobem na zrobienie tego jest zainstalowanie Pythona jako alternatywnej wersji.

e.g.
wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2 
tar xf Python-2.7.3.tar.bz2
cd Python-2.7.3
./configure --prefix=/usr/local/
make && make altinstall

Robiąc to, istniejące skrypty, takie jak yum, nadal działają z / usr / bin / python. a twoją domyślną wersją Pythona będzie ta zainstalowana w / usr / local / bin. tzn. kiedy wpiszesz python, otrzymasz 2.7.3

Dzieje się tak, ponieważ. Zmienna $ PATH ma / usr / local / bin przed usr / bin.

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

Jeśli python2.7 nadal nie działa jako domyślna wersja Pythona, musisz to zrobić

export PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
Prakash Kamath
źródło
-8

Domyślam się, że ręcznie zainstalowałeś wersję 2.7, podczas gdy 2.6 pochodzi z pakietu?

Prosta odpowiedź brzmi: odinstaluj pakiet Pythona.

Bardziej złożona to: nie instaluj ręcznie w / usr / local. Zbuduj pakiet w wersji 2.7, a następnie zaktualizuj.

Obsługa pakietów zależy od używanej dystrybucji.

emesik
źródło
5
Pakiet Pythona jest prawie na pewno wymagany przez dystrybucję. CentOS jest oparty na RPM, a połowa narzędzi RPM i YUM jest napisana w Pythonie.
abarnert
Drogi Michale, radzę odinstalować ręcznie zainstalowany python2.7!
AVA
Prostym rozwiązaniem byłoby usunięcie wszystkiego w / usr / local /, ale w ten sposób usuwasz wszystko, co skompilowałeś i zainstalowałeś ręcznie. Nie ma dobrego sposobu na śledzenie, które pliki należą do oprogramowania w / usr / local iz tego powodu instalowanie czegokolwiek tam jest generalnie odradzane. Być może masz tam tylko Pythona. Jeśli / usr / local / bin zawiera tylko pliki wykonywalne Pythona, masz dużą szansę, że usunięcie niczego innego nie zepsuje.
emesik
2
Nigdy nie powinieneś odinstalowywać Pythona. Weź to ode mnie. Zrobiłem to i to zepsuło mój system. Od tego zależy wiele aplikacji. To jest bardzo nierozsądne.
Patrick Mutwiri,