Resolver

Flask 'Address already in use': liberar el puerto 5000

Arrancas Flask y te dice que el puerto ya está ocupado. Por qué pasa, cómo liberar el puerto en Windows, macOS y Linux, y cómo evitar que se repita.

Ejecutas tu app y Flask, en lugar de arrancar, te suelta esto:

OSError: [Errno 98] Address already in use

(en Windows el número cambia: [WinError 10048]). Traducido: el puerto 5000, que Flask usa por defecto, ya está ocupado por otro proceso. Y ese “otro proceso” casi siempre eres tú mismo.

Por qué ocurre

La causa más común: una instancia anterior de Flask que no se cerró bien. Cerraste la terminal a lo bruto, o el proceso quedó colgado, y sigue “sentado” sobre el puerto 5000 sin soltarlo. Cuando intentas arrancar de nuevo, el puerto está tomado y Flask no puede usarlo.

A veces es otra cosa la que ocupa el 5000 —en macOS moderno, por ejemplo, el servicio AirPlay usa ese puerto—, pero en el 90% de los casos es un Flask fantasma tuyo.

Tienes dos caminos: matar el proceso que ocupa el puerto, o usar otro puerto. Vemos los dos.

Solución rápida: usa otro puerto

Si solo quieres seguir trabajando ya, arranca Flask en un puerto distinto:

flask run --port 5001

O dentro del código:

if __name__ == "__main__":
    app.run(port=5001)

Problema resuelto en un segundo. Pero si prefieres liberar el 5000 (porque el proceso fantasma seguirá ahí consumiendo), sigue leyendo.

Liberar el puerto 5000

En Windows

Primero, encuentra qué proceso lo ocupa:

netstat -ano | findstr :5000

Eso te devuelve una línea que termina en un número: el PID (identificador del proceso). Con ese número, ciérralo:

taskkill /PID numero_pid /F

Reemplaza numero_pid por el que te dio el comando anterior. El /F fuerza el cierre.

En macOS y Linux

Un solo comando encuentra y libera el puerto:

lsof -ti:5000 | xargs kill -9

lsof -ti:5000 obtiene el PID del proceso en el puerto 5000, y kill -9 lo cierra. Si no tienes lsof, en Linux funciona también:

fuser -k 5000/tcp

Caso especial de macOS: AirPlay

Si en tu Mac el puerto 5000 lo ocupa un proceso del sistema llamado ControlCenter, es AirPlay Receiver. No lo mates: mejor desactívalo en Ajustes del Sistema → General → AirDrop y Handoff → desactiva “Receptor de AirPlay”. O simplemente usa otro puerto para Flask, que es más sencillo.

Cómo evitar que se repita

El fantasma aparece casi siempre por no cerrar Flask correctamente. La forma limpia de detenerlo es con Ctrl+C en la terminal donde corre, no cerrando la ventana a lo bruto. Ese Ctrl+C le dice a Flask que libere el puerto antes de morir.

Si trabajas con varios proyectos a la vez, asignar a cada uno un puerto fijo distinto (5000, 5001, 5002…) evita choques entre ellos. Es lo que se hace en la práctica cuando tienes varias apps corriendo en paralelo.


¿El puerto lo ocupaba algo que no lograste identificar? Escríbeme desde contacto con lo que te devolvió netstat o lsof y lo revisamos.

← Más de Resolver