Python [Errno 98] La dirección ya está en uso

96

En mi programa de socket de Python, a veces necesito interrumpirlo con Ctrl-C. Cuando hago esto, cierra la conexión usando socket.close().

Sin embargo, cuando intento volver a abrirlo, tengo que esperar lo que parece un minuto antes de poder conectarme de nuevo. ¿Cómo se cierra correctamente un enchufe? ¿O es esto intencionado?

Skylerl
fuente

Respuestas:

120

Sí, está destinado. Aquí puede leer una explicación detallada . Es posible anular este comportamiento configurando la opción SO_REUSEADDR en un socket. Por ejemplo:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Bartosz
fuente
Extraño. Lo llamé justo antes de enlazar y el error aún se produce. Debo estar cometiendo un error en otra parte.
byxor
No importa, tuve una condición de carrera extraña al enlazar y cerrar repetidamente en subprocesos separados para mis pruebas automatizadas.
byxor
Necesita importar el módulo llamado socket.
Bartosz
32
$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12  
python -m SimpleHTTPServer

$ kill 81211
ayoub laaziz
fuente
2
Desafortunadamente, no siempre funciona. Este fue mi pensamiento inmediato cuando me encontré con este problema, pero no hay un proceso de Python para matar en mi caso.
Kryten
14

porque está intentando ejecutar el servicio en el mismo puerto que ya se está ejecutando.

en algún momento sucede porque su servicio no se detiene en la pila de procesos. tienes que matarlos

no es necesario instalar nada aquí es el comando de una línea para matar todos los procesos de Python en ejecución.

para SO basado en Linux:

Intento:

kill -9 $(ps -A | grep python | awk '{print $1}')

Pescado:

kill -9 (ps -A | grep python | awk '{print $1}')
MohitGhodasara
fuente
1
Funcionó para mí ¡Gracias!
Código
1
Funcionó
7

Una solución simple que funcionó para mí es cerrar la Terminal y reiniciarla.

Siddharth Sethia
fuente
7

Nada funcionó para mí, excepto ejecutar un subproceso con este comando, antes de llamar HTTPServer(('', 443), myHandler):

kill -9 $(lsof -ti tcp:443)

¡Por supuesto, esto es solo para sistemas operativos similares a Linux!

Mirko
fuente
4

En primer lugar, busque el ID del proceso de Python usando este comando

ps -fA | grep python

Obtendrá un número pid al nombrar su proceso de Python en la segunda columna

Luego mata el proceso usando este comando

kill -9 pid
Abdul Basit
fuente
0

Obtuve el mismo error:
Pasos seguidos:
1 - usado $ ps -fA | grep python
2 - Matado todo el proceso
3 - Terminal cerrado
4 - relanzado y lanzado la aplicación (mkchromecast).
5 - no recibí este mensaje de error.

Tengo otro problema. siguiendo eso.

silvertech048
fuente
0

ejecutar el comando

fuser -k (port_number_you_are _trying_to_access)/TCP

ejemplo de matraz: fuser -k 5000/tcp

Además, recuerde que este error surge cuando intercala ctrl + z. así que para terminar use ctrl + c

Manoj Kumar M
fuente