Introducción
Manejar múltiples entornos virtuales de Python puede volverse engorroso: recordá la ruta de cada venv, escribir comandos largos para activarlos y no contar con autocompletado en el shell. Esta guía muestra cómo simplificar el proceso con funciones personalizadas en bash y completion, reduciendo la fricción en el día a día.
Qué es y para qué sirve
Un virtualenv (entorno virtual) aísla una distribución de Python y sus paquetes, permitiendo instalar dependencias específicas para un proyecto sin afectar el sistema o otros entornos. Es la forma estándar de gestionar dependencias en Python desde la versión 3.3+, usando el módulo venv (o virtualenv en versiones anteriores).
El problema surge al escalar: con decenas de entornos, activarlos manualmente (source ~/.venv/proyecto/bin/activate) es repetitivo y propenso a errores. Las soluciones aquí presentadas automatizan:
- Activación con un comando corto (setup-venv proyecto).
- Autocompletado de nombres de entornos en la terminal.
- Centralización de los entornos en un directorio dedicado (ej: ~/.venv).
Prerequisitos
- Sistema operativo: Debian 10+ o derivados (Ubuntu, etc.). Los comandos asumen bash como shell.
- Python: Versión 3.3 o superior (verificá con python3 –version).
- Paquetes: python3-venv (para el módulo venv). En Debian: sudo apt-get install python3-venv.
- Permisos: Acceso de escritura en tu directorio home y /etc/bash_completion.d/ (requiere sudo).
Guía paso a paso
1. Crear un directorio para los entornos
Centralizá todos los virtualenvs en un directorio, por ejemplo ~/.venv:
mkdir ~/.venv
2. Añadir la función de activación a tu configuración bash
Editá ~/.bashrc (o ~/.bash_aliases) y agregá la siguiente función:
setup-venv() {
if [ -z «$1» ]; then
echo «Usage: setup-venv
return 1
fi
venv_path=»$HOME/.venv/$1″
if [ ! -d «$venv_path» ]; then
echo «Virtualenv ‘$1’ not found in $venv_path»
return 1
fi
source «$venv_path/bin/activate»
}
Resultado esperado: Al ejecutar setup-venv
3. Crear un virtualenv de prueba
python3 -m venv ~/.venv/mi_proyecto
Verificá: ls ~/.venv debe mostrar mi_proyecto.
4. Activar el entorno con la nueva función
setup-venv mi_proyecto
Resultado esperado: El prompt del shell debe mostrar (mi_proyecto) al inicio, y which python debe apuntar a ~/.venv/mi_proyecto/bin/python.
5. Habilitar autocompletado de nombres de entornos
a. Instalar bash-completion (si no está instalado)
sudo apt-get install bash-completion
Nota: En Debian, este paquete activa automáticamente el completion al iniciar el shell. Si usás ~/.bash_profile, asegurate de que tenga:
source ~/.bashrc
b. Crear el archivo de completion para setup-venv
Creá /etc/bash_completion.d/venv con el siguiente contenido:
_setup_venv() {
local cur=${COMP_WORDS[COMP_CWORD]}
local opts=$(find «$HOME/.venv» -mindepth 1 -maxdepth 1 -type d -printf «%f\n»)
COMPREPLY=($(compgen -W «${opts}» ${cur}))
}
complete -F _setup_venv setup-venv
Permisos: Asegurate de que el archivo sea legible por todos:
sudo chmod 644 /etc/bash_completion.d/venv
c. Recargar la configuración del shell
source ~/.bashrc
Verificá: Escribí setup-venv (con un espacio al final) y presioná Tab. Debe mostrar una lista de los entornos disponibles en ~/.venv.
6. Desactivar el entorno
deactivate
Resultado esperado: El prompt debe volver a su estado original, sin el nombre del entorno entre paréntesis.
Consideraciones y buenas prácticas
- Nomenclatura: Usá nombres descriptivos para los entornos (ej: app_prod, data_processing). Evitá espacios y caracteres especiales.
- Espacio en disco: Los virtualenvs ocupan espacio. Limpiá entornos viejos con rm -rf ~/.venv/
. - Versiones de Python: Si necesitas una versión específica, especificala al crear el entorno:
python3.9 -m venv ~/.venv/proyecto_py39
- Proyectos con requirements.txt: Automatizá la creación y activación con un script como este:
setup-venv-from-req() {
if [ -z «$1» ]; then
echo «Usage: setup-venv-from-req
return 1
fi
venv_name=${2:-$(basename «$1» .txt)}
python3 -m venv ~/.venv/$venv_name
source ~/.venv/$venv_name/bin/activate
pip install -r «$1»
}
- Alternativas: Herramientas como pipx o poetry ofrecen funcionalidades similares, pero requieren instalar paquetes adicionales. Estas soluciones con bash son lightweight y no dependen de Python.
- Seguridad: No guardes scripts de activación en directorios con permisos de escritura para otros usuarios (ej: /tmp).
- Portabilidad: Para compartir entornos entre equipos, usá pip freeze > requirements.txt y versioná este archivo.
Conclusión
Con estas funciones y el autocompletado configurado, la gestión de virtualenvs se reduce a:
El tiempo ahorrado en comandos repetitivos se traduce en menos errores y más focalización en el código.
Fuentes
https://hashman.ca/managing-venvs/
