Dos versiones de python en linux. cómo hacer que 2.7 sea el predeterminado

124

Tengo dos versiones de python en mi 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

¿Cómo puedo hacer que 2.7 sea la versión predeterminada, de modo que cuando pythonescribo me pone en 2.7?

Antonio
fuente
1
Cuando le hice esto a mi fedora, el yum o apt-get ya no funcionaban.
Usuario
@Usuario: Sí, rompí un Mandrake antiguo de manera similar (cambiar /usr/bin/env pythona 2.6 en lugar de 2.3 significaba la mitad de los comandos rpmy todo urpmidejó de funcionar).
abarnert
He seguido el siguiente paso para instalar Django en Centos 5: primero, instalar Python 3.6 desde el código fuente. 2º: en el shell escriba el siguiente comando "alias python = / usr / local / bin / python3.6" 3º: ejecute el siguiente comando para instalar Django "pip3 install Django" 4º: "python -m django --version" para verificar el Django instalado con la versión "1.10.5"
showmyroutes
para mí /usr/bin/pythonfue un enlace simbólico que apunta a python2. Lo acabo de cambiar apython3.6
munish

Respuestas:

173

Probablemente no quieras cambiar tu Python predeterminado.

Su distribución instaló un sistema estándar en Python /usr/bin, y puede tener scripts que dependen de que esté presente, y seleccionados por #! /usr/bin/env python. Por lo general, puede salirse con la ejecución de scripts Python 2.6 en 2.7, pero ¿quiere arriesgarse?

Además de eso, hacer monos con /usr/binpuede romper la capacidad de su administrador de paquetes para administrar paquetes. Y cambiar el orden de los directorios en tu PATHafectará muchas otras cosas además de Python. (De hecho, es más común tenerlo /usr/local/binpor delante /usr/bin, y puede ser lo que realmente quieres, pero si lo tienes al revés, presumiblemente hay una buena razón para eso).

Pero no necesita cambiar su Python predeterminado para que el sistema ejecute 2.7 cuando escribe python.


Primero, puede configurar un alias de shell:

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

Escríbalo en un símbolo del sistema, o póngalo en su ~/.bashrcsi desea que el cambio sea persistente, y ahora cuando lo escribe pythonejecuta el 2.7 elegido, pero cuando algún programa en su sistema intenta ejecutar un script con /usr/bin/env pythonél ejecuta el estándar 2.6.


Alternativamente, solo cree un entorno virtual a partir de su 2.7 (o venvs separados para diferentes proyectos), y haga su trabajo dentro del venv.

abarnert
fuente
1
:( tienes razón. desafortunadamente, ya había creado un nuevo enlace symb según la respuesta de @ rohit. ¡Ahora mi yumcomando no funciona! Intenté crear el enlace sym pero no funciona sudo ln -sf /usr/bin/python2.6 /usr/bin/pythonninguna solución
Anthony
@Anthony: Supongo que antes /usr/bin/pythonno era realmente un enlace simbólico, era un script de envoltura o ejecutable, y ahora lo ha sobrescrito y no puede recuperarlo. Si rpmaún funciona, puede descargar manualmente el paquete Python e instalarlo sin él yum.
abarnert
Todavía puedo llegar al intérprete 2.6 cuando escribo, python2.6por lo que todavía está allí.
Anthony
77
@Anthony: Y en el futuro, si alguien le dice que cambie cosas en / usr / bin (o en cualquier lugar en / usr además de / usr / local), tome nota de lo que hay allí y
haga
¡En qué lío me metí! Tengo otra caja de centos que podría tener ese script. Si lo copio desde allí y lo pongo en / usr / bin de este cuadro. ¿Crees que funcionará?
Anthony
19

Agregue /usr/local/bina su PATHvariable de entorno, antes en la lista que /usr/bin.

En general, esto se hace en el archivo rc de su shell, por ejemplo, para bash, lo pondría en .bashrc:

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

Esto hará que su cáscara mirar primero para un pythonen /usr/local/bin, antes de que salga con el de /usr/bin.

(Por supuesto, esto significa que también debe tener un /usr/local/bin/pythonpunto python2.7, si aún no lo tiene, deberá vincularlo).

Ámbar
fuente
Posiblemente sea necesario configurar PYTHONHOME de manera apropiada / desarmarlo si algo lo establece.
Marcin
1
Esto no es tan peligroso como las soluciones que sugieren cambiar / usr / bin en sí ... pero sigo pensando que no es lo que realmente quiere el OP.
abarnert
Esto me ayudó después de actualizar Ubuntu 14.xa 16.x
learn2day
4

Ingrese el comando

which python

//output:
/usr/bin/python

cd /usr/bin
ls -l

Aquí puedes ver algo como esto

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

su python2.7 predeterminado está vinculado de manera flexible al texto 'python'

Así que elimine la pitón softlink

sudo rm -r python

luego vuelva a intentar el comando anterior

ls -l

puedes ver que se elimina el enlace suave

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

Luego cree un nuevo enlace suave para python3.6

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

Luego intente el comando pythonen la terminal

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

Escribir help, copyright, creditso licensepara más información.

Sreenath
fuente
1
Tu publicación no es una respuesta a la pregunta de OP.
Frank
Esto resolvió un problema muy extraño para mí. Cuando verifico la versión de Python desde la raíz o el terminal normal, mostró 3.6.8 pero si creo un .sh y escribo python -version adentro, eso imprimió 2.7. Resulta que fue porque existía un softlink como se mencionó anteriormente. Seguí los pasos y está arreglado. Gracias.
S4nd33p
¡Gracias! Esto me resolvió el problema de "requiere Python 3 o posterior"
Tamim Attafi
4

Verifique la versión actual de python:

$ python --version

luego verifique que python es un enlace simbólico a qué archivo.

  $ ll /usr/bin/python

Salida Ex:

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

Verifique otras versiones disponibles de python:

$ ls /usr/bin/python*

Salida 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

Si desea cambiar la versión actual de python a la versión 3.6, edite el archivo ~ / .bashrc:

vim ~/.bashrc

agregue la siguiente línea al final del archivo y guarde:

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

Para instalar pip para 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

En Éxito, verifique la versión actual de pip:

$ pip3 -V

Salida Ex:

pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.6)
Shiv Buyya
fuente
2

Todo el sistema operativo viene con una versión predeterminada de python y reside en / usr / bin. Todos los scripts que vienen con el sistema operativo (por ejemplo, yum) apuntan a esta versión de Python que reside en / usr / bin. Cuando desea instalar una nueva versión de python, no desea romper los scripts existentes que pueden no funcionar con la nueva versión de python.

La forma correcta de hacerlo es instalar Python como una versión 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

Ahora, al hacer esto, los scripts existentes como yum todavía funcionan con / usr / bin / python. y su versión de python predeterminada sería la instalada en / usr / local / bin. es decir, cuando escribe python obtendría 2.7.3

Esto sucede porque La variable $ PATH tiene / usr / local / bin antes de usr / bin.

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

Si python2.7 todavía no tiene efecto como la versión predeterminada de python, deberá hacerlo

export PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
Prakash Kamath
fuente
-8

¿Supongo que ha instalado la versión 2.7 manualmente, mientras que 2.6 viene de un paquete?

La respuesta simple es: desinstalar el paquete python.

La más compleja es: no instalar manualmente en / usr / local. Cree un paquete con la versión 2.7 y luego actualícelo.

El manejo de paquetes depende de la distribución que use.

emesik
fuente
55
El paquete Python es casi seguro requerido por la distribución. CentOS está basado en RPM, y la mitad de las herramientas RPM y YUM están escritas en Python.
abarnert
Estimado Michael, ¡aconseje la opción de desinstalar python2.7 instalado manualmente!
AVA
La solución simple sería eliminar todo lo que se encuentra en / usr / local / pero de esta forma eliminará todo lo que compiló e instaló manualmente. No hay una buena manera de rastrear qué archivos pertenecen a qué software en / usr / local y, por esta razón, generalmente se desaconseja la instalación de cualquier cosa. Quizás solo tienes python allí. Si / usr / local / bin contiene solo ejecutables de Python, tiene una buena posibilidad de que la eliminación no rompa nada más.
emesik
2
Nunca debes desinstalar Python. Toma esto de mí. Lo hice y rompió mi sistema. Muchas aplicaciones dependen de ello. Esto es muy desaconsejado.
Patrick Mutwiri