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.
One Reply to “Compilar Python desde el código fuente”
Hermano!!! mil gracias por esto, me salvaste la vida!!!
Broo!!! thank you very much for this, you saved my life!!!!