Hoy os traigo un método fácil para instalar python 3.6 en Debian 9, y de paso solucionar un par de problemas que me han surgido durante dicha instalación.

Estos pasos se han probado sólo en Debian 9, pero seguramente serán igualmente compatibles con otros SO como Ubuntu o similares. En el caso de usar otro tipo de distribución que no esté basada en Debian, sería necesario cambiar el nombre de los paquetes a instalar, y además no puedo asegurar que funcione.

Además de instalar Python 3.6, se ha probado la instalación de Python 3.7 utilizando el mismo método, y se hab obtenido buenos resultados.

Descarga del código fuente

Lo primero que hay que hacer es instalar los requisitos para la compilación.

$ sudo apt-get update
$ sudo apt-get install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
$ sudo apt-get install libsqlite3-0

He separado la librería sqlite3 en otra línea, porque no es obligatoria para la instalación de Python 3.6, pero si recomendable si necesitamos su uso o previésemos necesitarlo, ya que para hacerlo posteriormente tendríamos que recompilar python 3.6 de nuevo.

Una vez instalados todos los paquetes necesarios para la compilación, procederemos a descargar el código fuente. Para ello visitaremos la página de Python y descargamos la versión que necesitemos.

$ wget https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tar.xz

Una vez la hayamos descargado, procederemos a descomprimirla y a entrar en la carpeta descomprimida.

$ tar xvf Python-3.6.10.tar.xz
$ cd Python-3.6.10

Estando ya en la carpeta del código fuente, procederemos a configurar la compilación con las opciones –enable-optimizations y –enable-loadable-sqlite-extensions. Esta última opción es para habilitar la compilación de las librerías SQLite, y al igual que la librería, es opcional. Por supuesto, para que funcione es necesario haber instalado la librería previamente.

$ ./configure --enable-optimizations --enable-loadable-sqlite-extensions

Una vez finalizada la configuración de la compilación, procederemos a ejecutar el comando make para generar los binarios.

$ make -j 8

NOTA: La opción -j indica el número de hilos a utilizar, por lo que se recomienda configurarlo acorde con el número de procesadores que tengamos. En el caso de que no queramos utilizar toda la potencia de la máquina para no afectar a otros servicios, se puede poner inferior.

Ya terminado el proceso de compilación (el cual puede tardar 15-20 minutos dependiendo de la potencia de la máquina), ya podremos proceder a instalar python 3.6 en Debian.

$ sudo make altinstall

Con esto ya habremos terminado de instalar la versión de python 3.6 en nuestro Debian. Ahora deberemos verificar que se ha instalado correctamente.

$ python3.6 --version
Python 3.6.10

Con esto ya habríamos conseguido instalar Python 3.6 en Debian y por lo tanto podremos utilizarlo a través de los comandos python3.6 y pip3.6, pero si lo que deseas es hacer que sea el predeterminado del sistema, continua leyendo el artículo.

Instalarlo como predeterminado

El proceso seguido arriba es para instalar la versión de python que necesitemos, pero esto no lo convierte en el predeterminado del sistema. Para poder ponerlo como predeterminado tendremos que proceder a configurarlo como alternativa para python3.

NOTA: Este proceso hace que algunas funciones del SO se vean afectadas, por lo que posteriormente procederemos a solucionar dichos problemas. El problema no es complejo, ya que en el caso de necesitarlo siempre podremos volver atrás con dos comandos.

Antes de continuar, es importante saber qué versiones de python3 tenemos instaladas, así podremos proceder a configurarlas todas como alternativa y nos será más fácil cambiar de unas a otras.

$ ls -1 /usr/bin/python3*
/usr/bin/python3
/usr/bin/python3.5
/usr/bin/python3.5-config
/usr/bin/python3.5m
/usr/bin/python3.5m-config
/usr/bin/python3-config
/usr/bin/python3-jsondiff
/usr/bin/python3-jsonpatch
/usr/bin/python3-jsonpointer
/usr/bin/python3m
/usr/bin/python3m-config

Dado que el sistema en el que hice la prueba está limpio, sólo disponemos de la versión 3.5 que es la predeterminada. Aquí no veremos la versión de python3 que acabamos de instalar, ya que esta se instala en otra carpeta.

Una vez que sepamos las versiones de python3 que tenemos, procederemos a configurarlas todas como alternativas para python3.

$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.6 2 

También será necesario que hagamos el mismo proceso con pip para evitar problemas al instalar librerías.

$ sudo mv /usr/bin/pip3 /usr/bin/pip3.5
$ sudo update-alternatives --install /usr/bin/pip3 pip3 /usr/bin/pip3.5 1
$ sudo update-alternatives --install /usr/bin/pip3 pip3 /usr/local/bin/pip3.6 2

NOTA: El primer comando es para renombrar el binario de pip3.5 y que así no tengamos problemas al instalar las alternativas. Esto es debido a que cuando se instala el paquete python3-pip, este se instala directamente como pip3. Esto lo tendremos que tener en cuenta en un futuro si actualizamos el paquete.

Una vez que hayamos configurado las alternativas de python3 y pip3, ya podríamos configurarlas con los siguientes comandos:

$ update-alternatives --config python3
There are 2 choices for the alternative python3 (providing /usr/bin/python3).

  Selection    Path                      Priority   Status
------------------------------------------------------------
  0            /usr/local/bin/python3.6   2         auto mode
  1            /usr/bin/python3.5         1         manual mode
* 2            /usr/local/bin/python3.6   2         manual mode

Press <enter> to keep the current choice[*], or type selection number: 
$ update-alternatives --config pip3
Existen 2 opciones para la alternativa pip3 (que provee /usr/bin/pip3).

  Selección   Ruta             Prioridad  Estado
------------------------------------------------------------
* 0            /usr/bin/pip3.6   2         modo automático
  1            /usr/bin/pip3.5   1         modo manual
  2            /usr/bin/pip3.6   2         modo manual

Pulse <Intro> para mantener el valor por omisión [*] o pulse un número de selección:

Solución a problemas en el SO

Por desgracia, a Debian no le gusta mucho que cambiemos la versión de python3 por defecto, y esto provocará una serie de problemas con algunos comandos como por ejemplo lsb_release y apt-get, lo cual afectará a la instalación de ciertos paquetes con pip, y obviamente con apt-get. Esto se debe principalmente a que hay algunas librerías de python3 que vienen con el SO, y que son necesarias para su funcionamiento.

La primera opción es cambiar la versión de python3 cada vez que vayamos a ejecutar alguno de esos comandos, con el comando update-alternatives que vimos arriba. Esto aparte de ser engorroso, no soluciona el problema de instalación de paquetes con pip3.6, por lo que tendremos una versión de python3 que dará problemas con la instalación de ciertos paquetes.

La segunda opción es parchear la librería lsb_release.py para que siempre se ejecute con python 3.5 independientemente de cual sea la versión por defecto. Esto soluciona el problema del comando lsb_release, pero seguiremos con el problema con el comando apt-get, por lo que tendremos que cambiar de versión cada vez que querramos usarlo.

La tercera opción que tenemos, es linkear las librerías de python3.5, ya que estas son compatibles con python3.6 y funcionarán sin problemas. Para ello seguiremos estos pasos.

Linkeamos con ln la librería lsb_release.py a la carpeta de python 3.6. Podemos simplemente copiarla, pero si la linkeamos se actualizará junto con la versión de python 3.5.

$ sudo ln -s /usr/share/pyshared/lsb_release.py /usr/lib/python3.6/site-packages/lsb_release.py

Una vez linkeada la librería de lsb_release, sólo nos queda solucionar el problema con apt, para lo cual también linkearemos las librerías apt_pkg para falsear que las tenemos para la versión 3.6.

$ cd /usr/lib/python3/dist-packages
$ ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.cpython-36m-x86_64-linux-gnu.so
$ ln -s apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.cpython-36m-x86_64-linux-gnu.so

Con esto ya se habrán solucionado los dos problemas principales.

Espero que este manual os haya servidor y que os quite algún quebradero que otro de cabeza.

Un saludo.

Daniel Carrasco

DevOps con varios años de experiencia, y arquitecto cloud con experiencia en Google Cloud Platform y Amazon Web Services. En sus ratos libres experimenta con Arduino y electrónica.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.