Título: Ctrl+C en windows me lo detecta pero no sale del script | Python3 Publicado por: Drakaris en 9 Enero 2022, 18:45 pm Buenas,
Feliz año ;D Estoy con un socket servidor que al estar corriendo quiero que si el usuario hace Ctrl+C en el CMD este sale limpiamente (con un SIGINT). main.py Código
El HandlerSignals() esta en una carpeta 'sources' en el archivo handlerSignals -main.py | - sources/ \-- handlerSignals.py handlerSignals.py Código
Como se puede ver si el sistema es Windows, se ejecuta Citar win32api.SetConsoleCtrlHandler(self.shutdownWin, True) Que esta en escucha de Ctrl+C en windows CMD. Así que al ser presionado se llama a la funcion shutdownWin que este imprime "Ctrl+C" y lanza una excepcion SystemExit.Que esta excepcion teoricamente es recogida por main.py que y sale de la terminal. Pero no ocurre eso. Al lanzarse el SystemExit no imprime "KeyboardInterrupt". Y no se porque pasa.... https://imgur.com/gallery/x5jxQhM Parece como si la excepcion no se pueda pasar al main.py Como lo puedo solucionar...? Gracias por vuestra atencion. Título: Re: Ctrl+C en windows me lo detecta pero no sale del script | Python3 Publicado por: Drakaris en 10 Enero 2022, 10:25 am Buenos dias!
Solución Ya esta resuelto. Puede que no sea la mejor opcion, ni la más adecuada, pero me veo obligado ha hacerlo así pues Windows tiende a matar los procesos.Así como lo queria hacer tendría que funcionar para mis ojos, pero la realidad es que no, y no se porque (en Linux funcionaria....). Lo que hice es añadir el HandlerSignals() justo despues de crear el socket (dentro del __createSocket, despues del listen) main.py: Código
La diferencia es que la funcion HnadlerSignals(sock) coge como parametro la variable que contiene el objecto socket. handlerSignals.py Código La gran diferencia de handlerSignals.py con el anterior es que, al hacer Ctrl+C y llamar a la funcion shutdownWin(), este cierra el socket y me muestra el Notify de el try/except/finally del main.py. Así me funciona correctamente, aunque no se si es muy buena practica,pero me funciona. Hay que tener en cuenta que el HandlerSignals() debe estar justo después de la declaración de la variable self.sock. Yo lo pongo despues del self.sock.listen(). https://imgur.com/gallery/B2VR7Lp ¿Porque tan pesado con el Ctrl+C en CMD? Por dos cosas:
NSSM al parar un servicio, implicitamente hace un Ctrl+C y espera una reaccion. Si no hay reaccion este se cierra forzosamente y muestra el siguiente mensaje. https://imgur.com/gallery/n5UO4sL Ahora si el script detecta el Ctrl+C en CMD.... https://imgur.com/gallery/qLnBGOi En el NSSM este es configurado así https://imgur.com/gallery/ZEwvmOq Gracias por vuestra atencion! ;-) |