How do I capture SIGINT in Python?

前端 未结 12 1744
长发绾君心
长发绾君心 2020-11-21 22:54

I\'m working on a python script that starts several processes and database connections. Every now and then I want to kill the script with a Ctrl+C sign

12条回答
  •  猫巷女王i
    2020-11-21 23:16

    I adapted the code from @udi to support multiple signals (nothing fancy) :

    class GracefulInterruptHandler(object):
        def __init__(self, signals=(signal.SIGINT, signal.SIGTERM)):
            self.signals = signals
            self.original_handlers = {}
    
        def __enter__(self):
            self.interrupted = False
            self.released = False
    
            for sig in self.signals:
                self.original_handlers[sig] = signal.getsignal(sig)
                signal.signal(sig, self.handler)
    
            return self
    
        def handler(self, signum, frame):
            self.release()
            self.interrupted = True
    
        def __exit__(self, type, value, tb):
            self.release()
    
        def release(self):
            if self.released:
                return False
    
            for sig in self.signals:
                signal.signal(sig, self.original_handlers[sig])
    
            self.released = True
            return True
    

    This code support the keyboard interrupt call (SIGINT) and the SIGTERM (kill )

提交回复
热议问题