¿Cuál es la forma correcta de administrar múltiples versiones de Python?


21

Tengo una máquina con Python 2.6 instalada como Python predeterminada. Luego, instalé Python 2.7, y creé manualmente / usr / bin / python como un enlace simbólico a la nueva instalación.

Entonces, me encontré con problemas con el comando no encontrado . Estoy tratando de reinstalarlo:

sudo apt-get remove command-not-found

y me sale este error:

/usr/bin/python does not match the
python default version. It must be
reset to point to python2.6

Pero realmente quiero que Python 2.7 sea el predeterminado. ¿Cómo soluciono este desastre?

Respuestas:


16

Cambiar la Python predeterminada (o Perl, etc.) en un sistema operativo es una muy mala idea. Este intérprete es en realidad parte del sistema operativo y puede haber otros componentes del sistema operativo que están escritos específicamente para funcionar con esa versión del intérprete.

Por ejemplo, en Redhat, la herramienta yum que realiza actualizaciones de software del sistema es una aplicación de Python. Realmente no quieres romper esto. Dichas aplicaciones pueden depender de módulos Python específicos, quizás no estándar, que se están instalando y que la versión que instaló puede no tener. Por ejemplo, en Ubuntu, creo que algunas de las herramientas integradas del sistema operativo escritas en Python usan un ORM llamado Storm que no forma parte de la biblioteca estándar de Python. ¿Su instalación limpia de Python 2.7 tiene instalada la versión esperada específica del módulo Storm? ¿Tiene alguna versión de Storm? ¿No? Entonces acabas de romper una parte de tu sistema operativo.

La forma correcta de hacerlo es instalar su versión preferida de python y configurar su cuenta de usuario para usarla configurando su .bash_profile, ruta y demás. También es posible que desee consultar el módulo virtualenv para Python.


1
Busqué en Google mi camino hasta aquí. Sería -1 si tuviera el representante en esta pila. ¿Por qué? Debido a que el enfoque sugerido solo dice "instala tu versión preferida de python". ¿Cómo se hace eso sin la manguera del sistema python?
jez

@jez Los usuarios deben consultar las instrucciones de instalación para la combinación de aplicación y sistema operativo que elijan. En general, los paquetes de instalación de idiomas se instalarán en una ubicación benigna, no sobrescribirán los componentes centrales del sistema operativo, por lo que sobrescribir la versión del sistema operativo sería el caso especial.
Simon Hibbs

8

¿Cómo soluciono este desastre?

Nada más que reinstalar python. Deshacerá su cambio (el enlace simbólico).

¿Por qué lo quieres por defecto? Cada vez que lo necesite, simplemente use python2.7o incluya #!/usr/bin/python2.7(el shebang) al comienzo de sus scripts (ejecutables).

Si insiste en tener python2.7un valor predeterminado para todo el sistema, use una versión posterior de Ubuntu (actualmente es Ubuntu 11.04, con nombre en código Natty). Utiliza esa versión por defecto.

En el futuro, evite realizar intervenciones manuales como lo que hizo con el enlace simbólico. Esto es especialmente cierto para los archivos gestionados por distribución, y especialmente para bestias complejas como las instalaciones de Python.


Pensé que es razonable cambiar la instalación predeterminada de Python una vez que actualicé. Lo quiero por defecto porque quiero trabajar con el nuevo Python ... por defecto. Cuando pythonescribo desde bash, quiero obtener el nuevo python. ¿Hay una mejor manera de hacer esto que lo que hice?
ripper234

Solo para tener en cuenta: no creo que haya nada malo en la forma en que instalé python 2.7. El único movimiento "poco ortodoxo" fue cambiar el enlace simbólico, que pensé que era la forma correcta de configurarlo como predeterminado. ¿Hay una mejor manera?
ripper234

2
@ripper: Supongo que llegaré a este hilo un poco tarde. Como dice Tshepang, el pythonpaquete en Ubuntu determina la versión del sistema. Ahora, es posible personalizar su instalación, por lo que Python 2.7 es el predeterminado creando su propio paquete de Python, etc. se gestiona en Debian / Ubuntu. Tenga en cuenta que los otros paquetes de Python en el sistema están configurados para funcionar con 2.6 de manera predeterminada, por lo que, aparte de cualquier otra cosa, puede producirse una rotura.
Faheem Mitha

1
@Tshepang: ¡Buen resumen!
Faheem Mitha

12
@ ripper234: No cambie nada /usr/bin, eso está reservado para su distribución. En su lugar, haga /usr/local/bin/pythonun enlace simbólico a python2.7. Luego, los scripts que usan #!/usr/bin/env python(el idioma recomendado), así como los que escriben pythonen la línea de comando, ejecutarán Python 2.7. Las secuencias de comandos de la distribución que desean Python de la distribución pueden seguir llamando #!/usr/bin/python.
Gilles 'SO- deja de ser malvado'

2

Descargo de responsabilidad: acabo de publicar esta misma respuesta al desbordamiento de pila:

/programming/2812520/pip-dealing-with-multiple-python-versions/50319252

Aquí está mi opinión sobre el problema. Funciona para Python3. Las características principales son:

  • Cada versión de Python se compila desde la fuente
  • Todas las versiones se instalan localmente.
  • No estropea la instalación predeterminada de Python de su sistema de ninguna manera
  • Cada versión de Python está aislada con virtualenv

Los pasos son los siguientes:

  1. Si tiene varias versiones adicionales de Python instaladas de alguna otra manera, deshágase de ellas, por ejemplo, elimine $ HOME / .local / lib / python3.x , etc. (también las instaladas globalmente). Sin embargo, no toques la versión predeterminada de python3 de tu sistema.

  2. Descargue el código fuente para diferentes versiones de Python bajo la siguiente estructura de directorios:

    $HOME/
        python_versions/ : download Python-*.tgz packages here and "tar xvf" them.  You'll get directories like this:
          Python-3.4.8/
          Python-3.6.5/
          Python-3.x.y/
          ...
  3. En cada directorio "Python-3.xy /", haga lo siguiente (¡ NO use "sudo" en ninguno de los pasos!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. En "python_versions /" crea archivos como este:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. Ahora, cada vez que desee optar por python3.x, haga

    source $HOME/python_versions/env_python3x.bash

    para entrar en el virtualenv

  6. Mientras esté en virtualenv, instale sus paquetes de python favoritos con

    pip install --upgrade package_name
  7. Para salir de la versión de virtualenv y python simplemente escriba "deactivate"


0

Ponemos muchas distribuciones de Python en Mac y Ubuntu mucho y aquí están mis recomendaciones.

  1. Deje el sistema python sin molestias: nunca lo use.

  2. Si solo necesita una distribución primaria de Python, descargue e instale Canopy de forma inteligente. Cuando se instale, elija "establecer como mi python del sistema", y luego puede instalar paquetes desde el administrador de paquetes GUI de Canopy.

    • Canopy también es compatible con pipel comando PyPi package manager que le permite instalar paquetes (por ejemplo pip install python-twitter)
  3. Si planea usar entornos virtuales (es decir, está desarrollando programas de Python y desea un entorno de Python limpio y dedicado para cada uno, con un medio fácil para cambiar entre ellos), recomendaría Anaconda sobre Canopy debido a su herramienta de administración de entorno virtual . Esto te permitirá

0

pyenv

https://github.com/pyenv/pyenv

Pyenv le permite administrar múltiples versiones de Python sin sudo para un solo usuario, al igual que Node.js NVM y Ruby RVM .

Instalar Pyenv:

curl https://pyenv.run | bash

Luego agregue a su .bashrc :

export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Encuentra la versión de Python para instalar:

pyenv install --list

Instale la versión de Python que desea:

# Increase the chances that the build will have all dependencies.
# https://github.com/pyenv/pyenv/wiki/Common-build-problems
sudo apt build-dep python3
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
  libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
  xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

# Build and install a Python version from source.
pyenv install 3.8.0

Lista de versiones disponibles de Python:

pyenv versions

Ahora tenemos:

* system (set by /home/cirsan01/.pyenv/version)
  3.8.0

Seleccione una versión diferente de Python:

pyenv global 3.8.0
python --version
python3 --version

Ambas salidas:

Python 3.8.0

Ahora podemos proceder a instalar y usar paquetes normalmente:

pip install cowsay
python -c 'import cowsay; cowsay.tux("Python is fun")'
cowsay 'hello'

Podemos confirmar que todo está instalado localmente en nuestro entorno limpio con:

python -c 'import cowsay; print(cowsay.__file__)'
which cowsay

Por uso de proyecto

En la sección anterior, vimos cómo usar pyenv en una configuración global.

Sin embargo, lo que generalmente desea es establecer una versión de paquete y python específica para cada proyecto. Asi es como se hace.

Primero instale la versión de Python deseada como antes.

Luego, desde el directorio de su proyecto, configure la versión de Python deseada con:

pyenv local 3.8.0

que crea un archivo .python-version contiene la cadena de versión.

Y ahora instalemos un paquete localmente solo para nuestro proyecto: TODO: no parece una buena manera: /programming/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

Ahora, cuando alguien quiera usar su proyecto, hará:

pyenv local

que establece la versión de Python en la correcta.

Hilos relacionados:

Probado en Ubuntu 18.04, pyenv 1.2.15.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.