Instalando otra versión python con usuario no root


Escenario: Actualmente uso HomeAssistant con Debian 12, tanto en una Raspberry Pi 4 como en un servidor x86. La versión de Python del sistema sólo me deja llegar hasta HomeAssistant 2024.3.3.

Objetivo: Usar el la versión python 3.13.x para poder usar las últimas versiones de HomeAssistant y, no instalar python en el sistema como root de manera global.

La configuración uso es la siguiente:

  • Debian 12
  • Un usuario hass que es el que ejecuta HomeAssistant
  • HomeAssistant instalado en un entorno virtual

En la mayoría de los sitios de Internet compilan python y después lo instalan como mediante sudo make altinstall. Aunque altinstall lo instala en /usr/local, esto contamina el sistema operativo y en caso de limpieza hay que borrarlo todo manualmente. Además, no es buena práctica si se tienen otros servicios en el mismo sistema ya aparecen varios ejecutables python3.

Compilación e instalación

Es procedimiento es parecido a lo que aparece en Internet los pasos son:

  1. Descargar la versión requerida de Python
  2. Instalar dependencias para compilar Python con todas las posibles opciones
  3. Configurar la compilación cambiando el directorio destino de la instalación
  4. Compilar Python e Instalar python (sin sudo)
  5. Crear un entorno virtual con la nueva versión de Python
  6. Instalar en el entorno virtual HomeAssistant con pip.

Puede que cuando leas esto exista otra versión, en Python Downloads se puede consultar la lista. Procedo con la versión 3.13.2 y con un usuario no root

wget https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz
tar -xf Python-3.13.2.tar.xz

Antes de compilar Python hay que instalar las dependencias necesarias. En Debian son las siguientes:

sudo apt -y install --no-install-recommends \
    build-essential \
    gdb \
    lcov \
    libbz2-dev \
    libffi-dev \
    libgdbm-dev \
    liblzma-dev \
    libncurses5-dev \
    libreadline-dev \
    libsqlite3-dev \
    default-libmysqlclient-dev \
    libssl-dev \
    lzma \
    lzma-dev \
    tk-dev \
    uuid-dev \
    xvfb \
    zlib1g-dev \
    llvm \
    xz-utils\
    python3-openssl\
    git

Ya tengo el código fuente de Python en el directorio Python-3.13.2. El siguiente paso es configurar la compilación y aquí es donde añado una opción extra --prefix para instalarlo en el propio home del usuario que ejecuta HomeAssistant.

cd Python-3.13.2
./configure --prefix=$HOME/python3.13.2-bin --enable-optimizations
make -j4
make install

El último comando hace la instalación en el directorio indicado en --prefix. En ese directorio se encuentran los binarios de Python y pip. Ejecutando explícitamente ese python se puede crear un entorno virtual asociado a la nueva versión.

cd $HOME
$HOME/python3.13.2-bin/bin/python3 -m venv hass-venv
cd hass-venv
source bin/activate
pip install pip --upgrade
pip install homeassistant

Antes de ejecutar HomeAssistant es recomendable (aunque no necesario) instalar lo indicado en la siguiente sección.

Librerías adicionales para HomeAssistant

Para que HomeAssistant se ejecute correctamente necesita algunas librerías adicionales, algunas desde apt y otras desde pip. En Debian 12 se necesitan las siguientes librerías:

sudo apt install --no-install-recommends \
    libturbojpeg-dev ffmpeg tcpdump libpcap0.8-dev

Las librerías python no instalados automáticamente con pip, hay que instalarlas manualmente en el entorno virtual mediante:

cd hass-venv
source bin/activate
pip install zlib_ng isal mysqlclient

# Ejecuto HomeAssistant desde la línea de comandos
hass
#HomeAssistant #Debian