Ubuntu 24.04 incluye Python 3.12, pero instalar paquetes con un simple pip ahora falla con el error «externally-managed-environment». La solución es aislar cada proyecto en un entorno virtual. Esta guía muestra cómo preparar tu VPS Linux Infrawire, gestionar las dependencias correctamente y mantener una aplicación en marcha como servicio systemd.
📋 Requisitos previos
- Un VPS con Ubuntu 24.04 o Debian 12 y acceso SSH como root (la IP y la contraseña root están en tu área de cliente)
- Un proyecto Python o un script sencillo para probar
- Nociones básicas de línea de comandos
1. Instalar Python 3, pip y venv
Python 3 suele venir preinstalado, pero pip y el módulo venv son paquetes aparte.
Bashapt update apt install -y python3 python3-pip python3-venv python3-dev build-essential python3 --version pip3 --version
2. Entender el error PEP 668
Ejecutar pip install requests como root en Ubuntu 24.04 o Debian 12 muestra:
TEXTerror: externally-managed-environment
Esta protección (PEP 668) impide que pip sobrescriba archivos gestionados por apt y rompa herramientas del sistema. No la esquives con --break-system-packages. Usa una de las tres opciones limpias que siguen.
3. Crear un entorno virtual
Un entorno virtual es una copia privada de Python y pip para un solo proyecto.
Bashmkdir -p /opt/myapp && cd /opt/myapp python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install requests flask gunicorn
El prompt ahora empieza por (venv). Sal del entorno con deactivate.
4. Gestionar dependencias con requirements.txt
Congela las versiones exactas para poder reconstruir el proyecto de forma idéntica en otro servidor.
Bashpip freeze > requirements.txt # En una máquina nueva python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
5. Instalar herramientas de línea de comandos con pipx
Para herramientas independientes (httpie, yt-dlp, black...), pipx da a cada una su propio entorno virtual oculto y expone el comando globalmente.
Bashapt install -y pipx pipx ensurepath pipx install httpie
Abre después una nueva sesión para cargar el PATH actualizado. Para una librería que tenga paquete Debian, apt install python3-requests también es una opción válida.
6. Ejecutar la aplicación como servicio systemd
Crea un usuario dedicado sin privilegios y después una unidad que arranque el intérprete del entorno virtual (aquí Gunicorn sirviendo un objeto Flask llamado app en app.py).
Bashuseradd --system --home /opt/myapp --shell /usr/sbin/nologin myapp chown -R myapp:myapp /opt/myapp
Crea /etc/systemd/system/myapp.service:
INI1[Unit] 2Description=My Python application 3After=network.target 4 5[Service] 6User=myapp 7WorkingDirectory=/opt/myapp 8ExecStart=/opt/myapp/venv/bin/gunicorn --bind 127.0.0.1:8000 app:app 9Restart=on-failure 10RestartSec=5 11 12[Install] 13WantedBy=multi-user.target
Bashsystemctl daemon-reload systemctl enable --now myapp
Coloca un proxy inverso como nginx delante del puerto 8000 para exponerla en Internet.
✅ Verificar
Bashwhich python # debe apuntar dentro de /opt/myapp/venv cuando está activado pip list systemctl status myapp --no-pager journalctl -u myapp -n 50 --no-pager curl -I http://127.0.0.1:8000
🔧 Solución de problemas
The virtual environment was not created successfully because ensurepip is not available : falta el paquete venv. Instálalo con apt install python3-venv (o python3.12-venv) y repite el comando.
status=203/EXEC en systemd : la ruta de ExecStart es incorrecta o el archivo no es ejecutable por el usuario del servicio. Comprueba con ls -l /opt/myapp/venv/bin/gunicorn y los permisos asignados antes.
ModuleNotFoundError solo bajo systemd : el servicio usa el Python del sistema en lugar del entorno virtual. Llama siempre a /opt/myapp/venv/bin/python o al binario de venv/bin en ExecStart.
pip: command not found : usa python3 -m pip o activa primero el entorno virtual.
🎉 Tus proyectos Python ya están aislados, son reproducibles y se ejecutan como un servicio fiable.