Feliz año
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
from sources.handlerSignals import HandlerSignals class SocketServer: def __init__(self,**kwargs): try: HandlerSignals() # [...] # When the service shutdown successfully except (KeyboardInterrupt, SystemExit,GeneratorExit) as err: print("KeyboardInterrupt") None finally: try: self.sock.close() except: None print("Turnning off ClassAdminS") sys.exit(0) # continue code if __name__=="__main__": SocketServer(args=sys.argv)
El HandlerSignals() esta en una carpeta 'sources' en el archivo handlerSignals
-main.py
|
- sources/
\-- handlerSignals.py
handlerSignals.py
Código
import signal, sys, platform class HandlerSignals: def __init__(self): signal.signal(signal.SIGTERM,self.shutdown) # shutdown signal in Windows if platform.system().upper()=="WINDOWS": import win32api win32api.SetConsoleCtrlHandler(self.shutdownWin, True) def shutdownWin(self,a): print("Ctrl+c") raise SystemExit def shutdown(self,code,msg): raise SystemExit
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.