Due versioni di python su linux. come impostare 2.7 come predefinito


124

Ho due versioni di python sulla mia linuxbox:

$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

Come posso fare in modo che la 2.7 sia la versione predefinita così quando pythondigito mi inserisce nella 2.7?


1
Quando ho fatto questo alla mia fedora, yum o apt-get non funzionavano più.
Utente

@User: Sì, ho rotto un'antica Mandrake in modo simile (cambiare /usr/bin/env pythonin 2.6 invece di 2.3 significava metà dei comandi rpme tutti hanno urpmismesso di funzionare).
abarnert

Ho seguito il seguente passaggio per installare Django su Centos 5: primo, installa Python 3.6 dal codice sorgente. 2 °: nella shell digita il seguente comando "alias python = / usr / local / bin / python3.6" 3 °: esegui il seguente comando per installare Django "pip3 install Django" 4 °: "python -m django --version" per verificare il Django installato con la versione "1.10.5"
showmyroutes

per me /usr/bin/pythonera un collegamento morbido che puntava a python2. L'ho appena cambiato inpython3.6
munish

Risposte:


173

Probabilmente non vuoi effettivamente cambiare il tuo Python predefinito.

La tua distribuzione ha installato un sistema standard in Python /usr/bine potrebbe avere script che dipendono dalla presenza di questo e selezionati da #! /usr/bin/env python. Di solito puoi farla franca con l'esecuzione di script Python 2.6 in 2.7, ma vuoi rischiare?

Inoltre, la scimmia con /usr/binpuò interrompere la capacità del gestore di pacchetti di gestire i pacchetti. E cambiare l'ordine delle directory nel tuo PATHinfluenzerà molte altre cose oltre a Python. (In effetti, è più comune avere /usr/local/binprima di/usr/bin , e potrebbe essere quello che vuoi veramente, ma se lo hai al contrario, presumibilmente c'è una buona ragione per questo.)

Ma non è necessario modificare il Python predefinito per far funzionare il sistema 2.7 durante la digitazione python.


Innanzitutto, puoi impostare un alias di shell:

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

Tipo che al prompt, o mettere in ~/.bashrcse si desidera che la modifica di essere persistente, e ora, quando si digita pythoncorre vostra scelta 2.7, ma quando qualche programma sui vostri tentativi di sistema per eseguire uno script con /usr/bin/env pythonesso viene eseguito lo standard 2.6.


In alternativa, crea semplicemente un ambiente virtuale dal tuo 2.7 (o separa i venv per diversi progetti) e fai il tuo lavoro all'interno del venv.


1
:( hai ragione. sfortunatamente, avevo già creato un nuovo link symb come da risposta di @ rohit. Ora il mio yumcomando non funziona! Ho provato a creare il link sym di nuovo ma non funziona sudo ln -sf /usr/bin/python2.6 /usr/bin/pythonalcuna soluzione alternativa?
Anthony

@ Anthony: La mia ipotesi è che prima /usr/bin/pythonnon fosse effettivamente un collegamento simbolico, era uno script wrapper o un eseguibile, e ora l'hai sovrascritto e non puoi recuperarlo. Se rpmfunziona ancora, puoi scaricare manualmente il pacchetto Python e installarlo senza yum.
abarnert

Posso ancora arrivare all'interprete 2.6 quando digito, python2.6quindi è ancora lì.
Anthony

7
@Anthony: E in futuro, se qualcuno ti dice di cambiare qualcosa in / usr / bin (o ovunque in / usr oltre a / usr / local),
prendi

che brutto pasticcio mi sono cacciato !! Ho un'altra scatola dei centesimi che potrebbe avere quello script. Se lo copio da lì e lo metto in / usr / bin di questa casella. pensi che funzionerà?
Anthony

19

Aggiungi /usr/local/binalla tua PATHvariabile d'ambiente, prima nell'elenco di/usr/bin .

Generalmente questo viene fatto nel file rc della tua shell, ad esempio per bash, dovresti inserirlo in .bashrc:

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

Questo farà sì che il tuo guscio cerchi prima un pythonin /usr/local/bin, prima di andare con quello in /usr/bin.

(Ovviamente, questo significa che devi anche avere il /usr/local/bin/pythonpuntopython2.7 - se non lo è già, dovrai collegarlo simbolicamente.)


Forse potrebbe essere necessario impostare PYTHONHOME in modo appropriato / disattivarlo se è impostato da qualcosa.
Marcin

1
Questo non è così pericoloso come le soluzioni che suggeriscono di cambiare / usr / bin stesso ... ma penso ancora che non sia ciò che l'OP vuole effettivamente.
abarnert

Questo mi ha aiutato dopo l'aggiornamento da Ubuntu 14.x a 16.x
learn2day

4

Immettere il comando

which python

//output:
/usr/bin/python

cd /usr/bin
ls -l

Qui puoi vedere qualcosa di simile

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

il tuo python2.7 predefinito è soft link al testo 'python'

Quindi rimuovi il softlink python

sudo rm -r python

quindi riprova il comando precedente

ls -l

puoi vedere che il softlink è stato rimosso

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

Quindi crea un nuovo softlink per python3.6

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

Quindi prova il comando pythonnel terminale

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

Digitare help, copyright, creditso licenseper ulteriori informazioni.


1
Il tuo post non è una risposta alla domanda di OP.
Frank

Questo ha risolto un problema molto strano per me. Quando controllo la versione di python da root o dal terminale normale, mostrava 3.6.8 ma se creo un .sh e digito python -version all'interno, quello stampato 2.7. Si è scoperto che era perché esisteva un softlink come menzionato sopra. Ho seguito i passaggi ed è stato risolto. Grazie.
S4nd33p

Grazie! Questo mi ha risolto il problema di "richiesto python 3 o successivo"
Tamim Attafi il

4

Verifica la versione corrente di python tramite:

$ python --version

quindi controlla che Python sia un collegamento simbolico a quale file.

  $ ll /usr/bin/python

Uscita Ex:

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

Controlla altre versioni disponibili di python:

$ ls /usr/bin/python*

Uscita 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

Se vuoi cambiare la versione corrente di python alla versione 3.6, modifica il file ~ / .bashrc:

vim ~/.bashrc

aggiungi sotto la riga alla fine del file e salva:

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

Per installare pip per python 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

In caso di successo, controlla la versione corrente di pip:

$ pip3 -V

Uscita Ex:

pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.6)

2

Tutti i sistemi operativi vengono forniti con una versione predefinita di python e risiede in / usr / bin. Tutti gli script forniti con il sistema operativo (ad esempio yum) indicano che questa versione di python risiede in / usr / bin. Quando si desidera installare una nuova versione di python, non si desidera interrompere gli script esistenti che potrebbero non funzionare con la nuova versione di python.

Il modo giusto per farlo è installare Python come una versione alternativa.

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

Ora in questo modo gli script esistenti come yum funzionano ancora con / usr / bin / python. e la tua versione di python predefinita sarebbe quella installata in / usr / local / bin. cioè quando digiti python otterrai 2.7.3

Questo accade perché. La variabile $ PATH ha / usr / local / bin prima di usr / bin.

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

Se python2.7 continua a non avere effetto come versione di python predefinita, dovresti farlo

export PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"

-8

Immagino tu abbia installato la versione 2.7 manualmente, mentre la 2.6 proviene da un pacchetto?

La semplice risposta è: disinstalla il pacchetto Python.

Il più complesso è: non installare manualmente in / usr / local. Crea un pacchetto con la versione 2.7 e poi aggiorna.

La gestione dei pacchetti dipende dalla distribuzione utilizzata.


5
Il pacchetto Python è quasi certamente richiesto dalla distribuzione. CentOS è basato su RPM e metà degli strumenti RPM e YUM sono scritti in Python.
abarnert

Caro Michael, ti preghiamo di avvisare l'opzione per disinstallare python2.7 installato manualmente!
AVA

La soluzione semplice sarebbe rimuovere tutto in / usr / local / ma in questo modo rimuovi tutto ciò che hai compilato e installato manualmente. Non esiste un buon modo per tracciare quali file appartengono a quale software in / usr / local e per questo motivo l'installazione di qualsiasi cosa è generalmente sconsigliata. Forse hai solo python lì. Se / usr / local / bin contiene solo eseguibili python, hai buone possibilità che la rimozione non interrompa nient'altro.
emesik

2
Non dovresti mai disinstallare Python. Prendi questo da me. L'ho fatto e ha rotto il mio sistema. Molte app dipendono da questo. Questo è molto sconsiderato.
Patrick Mutwiri
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.