#!/usr/bin/env bash # install_python312 # ----------------- # Instala Python 3.12 en Linux detectando la distribución automáticamente. # - Ubuntu/Debian/Pop/Mint/Elementary: usa deadsnakes PPA # - Fedora/RHEL/CentOS: usa dnf # - Arch/Manjaro: usa pacman # Instala también python3.12-venv, python3.12-dev y verifica pip. # # USO: # source install_python312.sh # install_python312 install_python312() { echo "Instalando Python 3.12..." echo "" # Detectar distribución local distro="unknown" if [[ -f /etc/os-release ]]; then # shellcheck disable=SC1091 distro="$(. /etc/os-release && echo "${ID:-unknown}")" echo "Distribución detectada: ${distro}" else echo "install_python312: no se pudo detectar la distribución" >&2 fi echo "" # Verificar si Python 3.12 ya está instalado if command -v python3.12 &>/dev/null; then local current_version current_version="$(python3.12 --version 2>&1)" echo "Python 3.12 ya está instalado: ${current_version}" return 0 fi case "$distro" in ubuntu|debian|pop|mint|elementary) echo "Instalando Python 3.12 usando deadsnakes PPA..." echo "" echo "Actualizando repositorios..." if ! sudo apt update; then echo "install_python312: falló la actualización de repositorios" >&2 return 1 fi echo "Verificando software-properties-common..." if ! dpkg -l 2>/dev/null | grep -q software-properties-common; then if ! sudo apt install -y software-properties-common; then echo "install_python312: falló la instalación de software-properties-common" >&2 return 1 fi fi echo "Añadiendo deadsnakes PPA..." if ! sudo add-apt-repository -y ppa:deadsnakes/ppa; then echo "install_python312: falló al añadir deadsnakes PPA" >&2 return 1 fi echo "Actualizando lista de paquetes..." if ! sudo apt update; then echo "install_python312: falló la actualización después de añadir PPA" >&2 return 1 fi echo "Instalando Python 3.12 y herramientas..." if ! sudo apt install -y python3.12 python3.12-venv python3.12-dev python3-pip; then echo "install_python312: falló la instalación de Python 3.12" >&2 return 1 fi ;; fedora|rhel|centos) echo "Instalando Python 3.12 usando dnf..." if ! sudo dnf install -y python3.12 python3.12-devel; then echo "install_python312: falló la instalación con dnf" >&2 return 1 fi ;; arch|manjaro) echo "Instalando Python 3.12 usando pacman..." if ! sudo pacman -S --noconfirm python; then echo "install_python312: falló la instalación con pacman" >&2 return 1 fi ;; *) echo "install_python312: distribución no soportada automáticamente: ${distro}" >&2 echo " Opciones manuales:" >&2 echo " - Compilar desde fuente: https://www.python.org/downloads/" >&2 echo " - Usar pyenv: curl https://pyenv.run | bash" >&2 return 1 ;; esac echo "" # Verificar instalación if ! command -v python3.12 &>/dev/null; then echo "install_python312: Python 3.12 no está disponible después de la instalación" >&2 echo " Puede que necesites reiniciar la terminal" >&2 return 1 fi local installed_version installed_version="$(python3.12 --version 2>&1)" echo "Python 3.12 instalado correctamente: ${installed_version}" echo "" # Verificar pip echo "Verificando pip para Python 3.12..." if ! python3.12 -m pip --version &>/dev/null; then echo "pip no disponible, instalando..." if ! python3.12 -m ensurepip --upgrade; then echo " Instala pip manualmente: curl -sS https://bootstrap.pypa.io/get-pip.py | python3.12" else echo "pip instalado para Python 3.12" fi else echo "pip disponible para Python 3.12" fi echo "" echo "Comandos útiles:" echo " python3.12 -m venv .venv - Crear entorno virtual" echo " source .venv/bin/activate - Activar entorno" } # Ejecutar si se invoca directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then install_python312 "$@" fi