Instalar Python "bien" con pyenv (y dejar de pelearte con las versiones)
Publicado el 20 de abril de 2026 • 11 minutos • 2141 palabras
Table of contents
- El problema de tener mil Pythons sueltos
- Entornos virtuales: cada proyecto con su mini-mundo
- pyenv: un sheriff para tus versiones de Python
- Instalar pyenv en Linux (Ubuntu como ejemplo)
- Instalar pyenv en macOS (con Homebrew)
- Instalar pyenv en Windows
- Usar pyenv: listar, instalar y activar versiones (global, local, shell)
- pyenv + entornos virtuales: el combo limpio
- Conclusión: un entorno limpio cuida de ti (y del planeta, un poco)
- Glosario rápido
- Fuentes y referencias
Si hay algo que une a la comunidad Python por encima de cualquier PEP, es el dolor compartido de tener varias versiones del intérprete conviviendo a la vez en la misma máquina.
Un día instalas Python 3.8 “para un proyecto”, al mes siguiente 3.11 porque lo exige otro, luego un instalador cualquiera te cuela Python 3.10 en el PATH sin pedir permiso… y terminas frente a la escena del crimen:
python --version # 3.11.4
python3 --version # 3.10.12
pip --version # usa 3.8 en algún sitio del disco
Lanzas un pip install convencido de que apunta a tu proyecto, pero en realidad aterriza en el Python del sistema; otro proyecto deja de funcionar, VS Code se hace un lío, tú también, y de repente “odio Python” cuando lo que en realidad odias es el caos que tú mismo has ido alimentando.
Vamos a poner orden con tres ideas:
- Por qué las versiones múltiples de Python son un lío si las gestionas “a pelo”.
- Qué son los entornos virtuales (y por qué no deberías vivir sin ellos).
- Cómo usar pyenv para instalar, elegir y aislar versiones de Python en Windows, macOS y Linux sin frustarse.
El problema de tener mil Pythons sueltos
Python tiene dos “capas” que se mezclan con facilidad:
- La versión del intérprete (3.8, 3.10, 3.12…).
- Los paquetes instalados en cada sitio (Django, FastAPI, NumPy, etc.).
Si instalas Python desde la web oficial en Windows, desde el store, luego desde un IDE, luego el que trae el sistema (en Linux o macOS)… terminas con varios intérpretes repartidos por el disco. Cada uno puede tener su propia carpeta de paquetes “globales”.
Sin una herramienta que ponga orden, pasan cosas como estas:
- Un proyecto antiguo que solo funciona en 3.9, pero tu
pythonpor defecto es 3.12. - Un
pip installque pisa dependencias de otro proyecto porque usas el Python del sistema. - Scripts de CI que funcionan en un entorno y fallan en otro, porque no es el mismo
pythonaunque el comando se llame igual.
Ahí es donde entran dos salvavidas: entornos virtuales y un gestor de versiones.
Vamos primero con lo primero.
Entornos virtuales: cada proyecto con su mini-mundo
Un entorno virtual (venv) es una carpeta que contiene:
- Una copia (o “vista”) de un Python concreto.
- Su propio
pip. - Su propia carpeta de paquetes instalados.
Dentro del venv, cuando haces pip install, solo se ensucia ese entorno, no el Python global, ni el de otros proyectos.
El flujo habitual (sin pyenv todavía):
python -m venv .venv # crear entorno virtual en la carpeta .venv
source .venv/bin/activate # Linux / macOS
# o .venv\Scripts\activate en Windows (cmd/PowerShell)
pip install requests
python main.py
deactivate # salir del entorno
La idea es que, por ejemplo:
- El proyecto A tiene su
.venvcon sus dependencias y su versión de Python. - El proyecto B tiene la suya, separada y sin conflictos.
Con eso ya reduces muchos dolores de cabeza.
Pero sigue faltando algo: ¿de dónde sale ese “python” que usas para crear venvs? ¿Cómo decides que este proyecto vaya con 3.8 y aquel con 3.12?
Ahí es donde brilla pyenv.
pyenv: un sheriff para tus versiones de Python
pyenv es un gestor de versiones de Python que se encarga de instalar, listar y elegir qué versión de Python se usa en cada contexto (global, por proyecto, por terminal).
Lo que hace, de forma muy resumida es:
- Descargar y compilar diferentes versiones de Python en
~/.pyenv/versions. - Añadir un pequeño “shim” al PATH para que
python,python3,pip, etc., apunten a la versión que tú hayas elegido. - Permite definir:
- Una versión global para tu usuario.
- Una versión local por proyecto (archivo
.python-versionen ese directorio). - Una versión solo para la sesión actual (comando
pyenv shell).
Con eso puedes decir cosas como “en general, usa Python 3.12, pero en esta carpeta concreta, cada vez que entre, quiero 3.10”, y pyenv se encarga de redirigir los binarios a la versión correcta.
Vamos a ver cómo instalarlo y usarlo en cada sistema.
Instalar pyenv en Linux (Ubuntu como ejemplo)
En Ubuntu (y la mayoría de Linux), el método recomendado hoy es usar el script oficial pyenv-installer o pyenv.run, que prepara todo.
- Instala dependencias para poder compilar Python (necesario para que pyenv construya las versiones):
sudo apt-get update
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
libffi-dev liblzma-dev
(Hay varias guías – ItsFOSS, DedicatedCore, OneUptime – que listan variantes de este conjunto; la idea es la misma: librerías de compilación y compresión.)
- Instala pyenv con el instalador oficial:
curl https://pyenv.run | bash
Esto suele instalar:
pyenvpyenv-virtualenv(extensión para gestionar venvs desde pyenv)pyenv-update
- Añade pyenv a la configuración de tu shell (ejemplo para
bash):
En ~/.bashrc o ~/.bash_profile (según uses login shell o no), añade:
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
# Opcional: para pyenv-virtualenv
# eval "$(pyenv virtualenv-init -)"
Guarda y recarga:
source ~/.bashrc
- Comprueba:
pyenv --version
Si responde con un número en vez de un “command not found”, estás listo.
Instalar pyenv en macOS (con Homebrew)
En macOS, la vía cómoda es Homebrew .
- Asegúrate de tener Homebrew (
brew --version). Si no, lo instalas desdebrew.sh(un solo comando en la web oficial). - Instala pyenv:
brew update
brew install pyenv
- Configura tu shell. En macOS moderno, por defecto usas
zsh, así que en~/.zshrcañade algo como:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
(Si usas bash, lo mismo pero en ~/.bash_profile o ~/.bashrc.)
- Recarga el shell:
source ~/.zshrc
- Comprueba:
pyenv --version
Si responde bien, ya puedes empezar a instalar Pythons como si esto fuera una barra libre.
Instalar pyenv en Windows
En Windows no puedes usar el pyenv “clásico” (está pensado para Unix), pero existe pyenv-win , un port específico.
Hay dos caminos habituales: manual y con un gestor de paquetes.
Con instalador / manual (pyenv-win)
La documentación oficial de pyenv-win explica cómo clonar el repo en %USERPROFILE%\.pyenv\pyenv-win y añadir su bin y shims al PATH. Es algo más artesanal: clonar el repo con git, ajustar las variables de entorno y reiniciar la consola.
Con Chocolatey (mucho más cómodo)
Si ya usas Chocolatey (el gestor de paquetes para Windows, al estilo de apt pero en PowerShell), puedes instalar pyenv-win con un solo comando:
- Abre PowerShell como administrador.
- Ejecuta:
choco install pyenv-win
- Asegúrate de que las variables de entorno de pyenv-win están configuradas. La guía habitual añade:
[System.Environment]::SetEnvironmentVariable('PYENV', "$env:USERPROFILE\.pyenv\pyenv-win\", "User")
[System.Environment]::SetEnvironmentVariable('PYENV_HOME', "$env:USERPROFILE\.pyenv\pyenv-win\", "User")
[System.Environment]::SetEnvironmentVariable('PATH', "$HOME\.pyenv\pyenv-win\bin;$HOME\.pyenv\pyenv-win\shims;" + $env:Path, "User")
Cierra y abre de nuevo la terminal, y prueba:
pyenv --version
Si ves versión, ya puedes usar pyenv-win para instalar y cambiar de Python con comandos muy parecidos a los de Linux/macOS.
Usar pyenv: listar, instalar y activar versiones (global, local, shell)
Con pyenv operativo, el flujo básico es casi igual en todos los sistemas (salvo matices Windows).
Ver qué versiones hay disponibles (en remoto)
Para ver todas las versiones de Python que pyenv puede instalar:
pyenv install --list
La lista es larga: verás cosas como 3.8.18, 3.9.18, 3.10.14, 3.11.9, 3.12.3, además de versiones antiguas y hasta 2.x para arqueología.
Instalar una versión concreta
Por ejemplo, para instalar Python 3.12.1:
pyenv install 3.12.1
pyenv descargará, compilará y dejará esa versión en ~/.pyenv/versions/3.12.1 (o donde toque en Windows).
Puedes comprobar qué versiones tienes ya instaladas con:
pyenv versions
Verás algo así:
system
3.10.14
* 3.12.1 (set by /home/tuusuario/.python-version)
Elegir versión global, local y por shell
Aquí viene la parte interesante:
pyenv global 3.12.1Establece la versión global para tu usuario. A partir de ahí, en cualquier carpeta que no tenga ajustes más específicos,pythonapuntará a 3.12.1.pyenv local 3.10.14Crea en el directorio actual un fichero llamado.python-versioncon el texto3.10.14. Cada vez que entres en esa carpeta (o subcarpetas), pyenv usará 3.10.14 automáticamente.pyenv shell 3.11.9Cambia la versión de Python solo para la sesión actual del shell. Cuando cierres la terminal, se olvida. Útil para pruebas rápidas.
El fichero .python-version es clave:
Es un archivo de texto plano que vive en la raíz de tu proyecto y dice “aquí, usa esta versión de Python”. Pyenv lo lee, ajusta sus shims, y de repente python, python3 y pip apuntan a la versión correcta sin que tengas que hacer nada más.
Puedes abrirlo y cambiarlo a mano si quieres (ej. 3.11.9 -> 3.12.1), pero lo normal es usar pyenv local.
Comprobar que realmente estás usando la versión que crees
Siempre que toques algo de pyenv, acostúmbrate a verificar:
python --version
which python # o 'where python' en Windows
En Linux/macOS, si todo va bien, which python debería apuntar a algo tipo:
/home/tu-usuario/.pyenv/shims/python
Y esa ruta de “shim” internamente redirige a la versión que hayas elegido (global o local).
pyenv + entornos virtuales: el combo limpio
Con pyenv puedes además crear entornos virtuales asociados a versiones concretas con pyenv virtualenv (extensión que suele venir con el instalador pyenv.run). El flujo típico:
# Proyecto nuevo
mkdir ~/proyectos/webapp && cd ~/proyectos/webapp
# Instalar Python deseado (si no lo tienes ya)
pyenv install 3.12.1
# Crear un virtualenv llamado webapp-env con esa versión
pyenv virtualenv 3.12.1 webapp-env
# Hacer que en esta carpeta se use ese entorno
pyenv local webapp-env
# Verificar
python --version
which python
A partir de ahí:
pip install flask requests pytest
y todas esas dependencias vivirán solo dentro de webapp-env. Otro proyecto puede usar 3.10.14 y tener su propio virtualenv sin interferir.
El resultado es exactamente lo que buscábamos:
- Versión de Python controlada por proyecto.
- Dependencias aisladas por proyecto.
- Nada de instalar cosas al azar en el Python del sistema.
Conclusión: un entorno limpio cuida de ti (y del planeta, un poco)
Puede sonar exagerado, pero un entorno de Python ordenado ahorra tiempo, frustración y recursos. Menos horas persiguiendo bugs causados por versiones cruzadas, menos reinstalaciones salvajes, menos contenedores enormes porque “yo qué sé qué hay instalado en mi máquina”.
Con pyenv decides qué Python va con qué proyecto, y con entornos virtuales decides qué paquetes viven dónde. El sistema se ensucia menos, tu cabeza también, y hasta tus builds de CI pueden ir más ligeras al saber exactamente qué necesitan.
Si nos ponemos poéticos: cada proyecto con su versión clara de Python y sus dependencias justas es un pequeño acto de sostenibilidad digital. Menos basura instalada “por si acaso”, menos tiempo de CPU rehaciendo lo que ya deberíamos tener controlado… y más energía (tuya y de la máquina) dedicada a hacer cosas que importan.
Y si no quieres pensar en el planeta, piensa en ti dentro de seis meses abriendo un repo viejo y diciendo:
“Gracias, yo del pasado, por haber dejado aquí un .python-version y un entorno limpio. Me has salvado la tarde.”
Glosario rápido
No te preocupes, nadie nació sabiendo qué es un shim. Para eso está esto.
- PEP (Python Enhancement Proposal): documento formal en el que se proponen cambios o nuevas funcionalidades para el lenguaje Python. Son las “leyes” que rigen cómo evoluciona Python.
- PATH: variable de entorno del sistema operativo que contiene una lista de directorios donde el sistema busca los ejecutables cuando escribes un comando en la terminal.
- shim: pequeño ejecutable intermediario que pyenv coloca en el PATH para interceptar las llamadas a
python,pip, etc., y redirigirlas a la versión correcta según la configuración activa. - pip: el gestor de paquetes oficial de Python. Permite instalar, actualizar y desinstalar librerías y herramientas desde el repositorio PyPI.
- CI (Continuous Integration): práctica de integración continua en la que cada cambio de código se compila y prueba automáticamente en un servidor, normalmente mediante pipelines de herramientas como GitHub Actions o Jenkins.
- login shell: tipo de sesión de terminal que se abre al iniciar sesión en el sistema (o al abrir una terminal nueva en macOS). Carga archivos de configuración distintos (como
~/.bash_profile) a los de una shell interactiva normal (~/.bashrc).
Fuentes y referencias
Si alguien te pregunta de dónde has sacado todo esto, aquí tienes las pruebas.
- pyenv - Simple Python Version Management - GitHub. Repositorio oficial de pyenv con documentación y guía de uso.
- Install pyenv on Ubuntu - DedicatedCore. Guía de instalación de pyenv en Ubuntu con dependencias.
- pyenv Ubuntu - It’s FOSS. Tutorial paso a paso de pyenv en Ubuntu.
- How to Install pyenv on Ubuntu 24.04 - Dev.to. Guía actualizada para Ubuntu 24.04.
- Install Multiple Python Versions with pyenv - OneUptime Blog. Gestión de múltiples versiones en Ubuntu.
- How to Install pyenv on Ubuntu 22.04 - EricSysmin. Guía para Ubuntu 22.04.
- Installing pyenv on macOS - Xebia. Instalación de pyenv en macOS con Homebrew.
- Installing pyenv on Mac - Winston Brown. Tutorial de pyenv para Mac.
- pyenv in Windows - Dev.to. Configuración de pyenv-win en Windows.
- pyenv-win Installation - GitHub. Documentación oficial de instalación de pyenv-win.
- Chocolatey + pyenv-win - Punaime. Instalación de pyenv-win con Chocolatey.
- Installing pyenv on Ubuntu Linux - Winston Brown. Guía alternativa de pyenv en Ubuntu.
