Compilar Python desde el código fuente - screenshot de la web de código fuente de Python

Cómo compilar Python desde el código fuente, y tener siempre la última versión. En general, un sistema operativo Linux (como Debian y su hermana para Raspberry Pi, Raspbian) incluye dos versiones de Python: la 2.7 y la 3.x (la x depende de la versión de Linux que tengas instalada). La versión 2.7 se mantiene por compatibilidad, pues gran parte de las bibliotecas que usan algunas aplicaciones y servicios de sistema basadas en Python dependen fuertemente de implementaciones en Python 2.7. Python 3 se incluye también por defecto y está llamada a sustituir a Python 2.7 en el largo plazo (Ubuntu, por ejemplo, ha dejado de incluir Python 2.7 en el sistema por defecto, y la Python Software Foundation (PSF) recomienda encarecidamente usar Python 3.x).

Una de las grandes limitaciones cuando trabajamos con la Raspberry Pi es la versión de Python incluida por defecto con Raspbian (ahora conocido como Raspberry Pi OS). Lo normal es que la última release de este sistema operativo incluya la versión actualmente en LTS (Long Term Support) de Python, pero si tenemos una Raspi desde hace tiempo, lo normal es que nuestra versión de Python quede obsoleta al cabo de un año o dos, haciendo que nos perdamos las nuevas características de Python en nuestros proyectos si no somos capaces de instalarlo en nuestra placa favorita.

De todas las formas de instalar Python desde cero, compilar desde el código fuente siempre es la más recomendable. No es un proceso fácil, pero nos aseguramos que el Python que recibimos está limpio y sólo incluye aquello que la PSF considera esencial para ejecutarlo con seguridad. En este artículo, te vamos a explicar paso a paso cómo instalar una versión de Python cualquiera, directamente desde el código fuente.

Descargar el código fuente de Python

El primer paso es ir a la web de Python y descargar la versión que queremos instalar del listado de versiones. En Linux, podemos hacer esto desde la consola de comandos usando wget. El ejemplo a continuación describe el comando que descarga la última versión estable disponible (3.10.5):

wget https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tgz

Pasado un tiempo, que depende de la velocidad de tu conexión, el archivo Python-3.10.5.tgz se habrá guardado en la carpeta que esté activa en ese momento (si no sabes qué carpeta es, pwd te mostrará la carpeta actual).

El siguiente paso es descomprimir el archivo anterior, para lo que usaremos el comando tar:

tar -xvzf Python-3.10.5.tgz

Esto crea una nueva carpeta en el directorio actual, llamada Python-3.10.5, en la que se incluyen todos los archivos fuente necesarios para compilar Python. El siguiente paso es comprobar que tenemos instalado todo lo necesario para compilar Python.

Paquetes necesarios para instalar Python

La compilación de programas en Linux requiere una serie de paquetes del sistema, que no suelen estar incluidos por defecto, y que se encargan de interpretar las configuraciones incluidas en la carpeta de código fuente de una aplicación para dar como salida un ejecutable que nuestro sistema operativo (Raspbian) entiende. En el caso de Python, el código fuente genera como paso final el ejecutable python que solemos llamar desde la consola de comandos o desde Visual Studio Code, con algunas particularidades que veremos más adelante.

El paquete necesario para compilar el código fuente de Python es build-essential que puede obtenerse ejecutando el siguiente comando:

sudo apt install build-essential 

Los siguientes paquetes también son necesarios para asegurar que todas las características de Python están disponibles después de la compilación:

sudo apt install libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev libffi-dev uuid-dev

Una vez instalado, ya estamos en disposición de compilar el código fuente de Python.

Compilar Python

La compilación de la versión de Python desde el código fuente sigue el procedimiento CMMI, muy común en aplicaciones basadas en C/C++, como Python. CMMI son las siglas de Configure, Make, y Make Install, que son los pasos de configuración previa, compilación e instalación en el sistema, respectivamente.

Para configurar la instalación de Python con sus opciones por defecto, nos desplazamos a la carpeta del código fuente de Python que hemos descomprimido, que en nuestro caso es:

cd Python-3.10.5

Y ejecutamos:

./configure

Python ahora configurará usando las opciones por defecto. Este proceso tarda un tiempo, y si ha completado correctamente nos mostrará el mensaje:

....
config.status: creating Modules/ld_so_aix
config.status: creating pyconfig.h
creating Modules/Setup.local
creating Makefile


If you want a release build with all stable optimizations active (PGO, etc),
please run ./configure --enable-optimizations

El siguiente paso es compilar Python, para lo que se ejecutará el comando:

make

La ejecución de make llevará un tiempo considerable, e irá mostrando en pantalla muchísimas líneas, porque está compilando uno a uno todos los archivos que permiten la ejecución de Python. No es nada raro que una compilación de este tipo tarde 10/15 minutos o más, así que recomendamos que seas paciente. Una vez se complete sin errores, el resultado en la consola será similar a este:

...
renaming build/scripts-3.10/pydoc3 to build/scripts-3.10/pydoc3.10
renaming build/scripts-3.10/idle3 to build/scripts-3.10/idle3.10
renaming build/scripts-3.10/2to3 to build/scripts-3.10/2to3-3.10
/usr/bin/install -c -m 644 ./Tools/gdb/libpython.py python-gdb.py
gcc -pthread -c -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall    -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden  -I./Include/internal  -I. -I./Include    -DPy_BUILD_CORE -o Programs/_testembed.o ./Programs/_testembed.c
gcc -pthread     -Xlinker -export-dynamic -o Programs/_testembed Programs/_testembed.o libpython3.10.a -lcrypt -lpthread -ldl  -lutil -lm   -lm 
sed -e "s,@EXENAME@,/usr/local/bin/python3.10," < ./Misc/python-config.in >python-config.py
LC_ALL=C sed -e 's,\$(\([A-Za-z0-9_]*\)),\$\{\1\},g' < Misc/python-config.sh >python-config

Python ya está compilado y listo para usar, sólo nos hace falta llamar al último comando del flujo CMMI, que instalará Python en nuestro sistema y habilitará todos los accesos (enlaces simbólicos) para poder usarlo en cualquier parte. Para ello, ejecutamos el siguiente comando:

sudo make install

Es necesario ejecutar este comando como sudo porque sino, Python no estará disponible para todos los usuarios, ya que se copia un enlace simbólico a /usr/bin, que requiere privilegios elevados. Una vez ejecutado, tras unos cuantos minutos de ejecución, la consola nos mostrará algo similar a esto:

...
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

Con esto, Python está disponible en su última versión (3.10.5) para nuestros proyectos con Raspberry Pi. Sólo nos resta verificar que la versión instalada está accesible. El warning que nos muestra tiene que ver con ejecutar Python como sudo. Dado que nunca trataremos de ejecutarlo como superusuario, podemos ignorarlo.

Verificar la instalación de Python

Para verificar la versión de Python que tenemos instalada, sólo es necesario ejecutar:

python --version

No obstante, si tratamos de ejecutar Python usando el comando anterior, lo más probable es que la salida que obtengamos sea:

2.7.18

Esta es la última versión disponible de Python 2.7 (es posible que si tu Raspbian tiene instalada una versión antigua, la versión sea incluso inferior). Para ejecutar Python 3, debemos recurrir a:

python3 --version

Pero hay otro problema, si llamamos al comando anterior, la versión devuelta no es la que acabamos de instalar, sino una anterior, como 3.7.13 o 3.9.13. Esto es debido a que para Raspbian, python3 está asignado a la versión de Python empaquetada con el sistema. En el caso de la versión que acabamos de compilar, si queremos acceder a ella, debemos ejecutar:

python3.10 --version

Esto mostrará como salida 3.10.5, que es la versión que hemos descargado y compilado. Si quieres sustituir la versión del sistema (la que se ejecuta cuando llamamos a python3), te aconsejamos que te lo pienses dos veces, porque de esa versión de Python dependen multitud de programas y servicios que hacen que tu Raspberry Pi funcione. En caso de que quieras usar la última versión en un proyecto de python (como Django), te recomendamos que uses entornos virtuales, pero su configuración la dejamos para otro artículo.

Este artículo forma parte de nuestra sección de programación. No dudes en echar un vistazo a otros artículos por si fueran de tu interés.

Leave a Comment

Your email address will not be published. Required fields are marked *

Información básica sobre protección de datos
Responsable Francisco de Asís Benavente Delgado +info...
Finalidad Gestionar y moderar tus comentarios. +info...
Legitimación Consentimiento del interesado. +info...
Destinatarios No se cederán datos a terceros, salvo obligación legal +info...
Derechos Acceder, rectificar y cancelar los datos, así como otros derechos. +info...
Información adicional Puedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.