如何在处理 SIGINT 时避免 python 异常

How to avoid python exception in while handling SIGINT

import signal
import time

def sigint_handler(signum, frame):
    print 'User pressed CTRL+C!'

signal.signal(signal.SIGINT, sigint_handler)

def main():
    while True:
       print 'Script to handle SIGINT'
       time.sleep(2)

##########

if __name__ == "__main__":
    main()

如何在执行代码时阻止 python 本身抛出的以下异常:

File "D:\Documents\scripts\ctrlc handler.py", line 19, in <module> main() 
File "D:\Documents\scripts\ctrlc handler.py", line 14, in main 
time.sleep(2) OError: [Errno 4] Interrupted function call

这个问题似乎与接收到的不同信号和抛出的不同错误有关。另请参阅 this 以供参考。我可以想出的解决方法是捕捉并忽略像这样抛出的 OSError/IOError:

import signal
import time

def sigint_handler(signum, frame):
    print 'User pressed CTRL+C!'

signal.signal(signal.SIGINT, sigint_handler)

def main():
    while True:
       print 'Script to handle SIGINT'
       try:
           time.sleep(2)
       except IOError:
           pass

##########

if __name__ == "__main__":
    main()

效果很好。

Script to handle SIGINT
User pressed CTRL+C!
Script to handle SIGINT
User pressed CTRL+C!
Script to handle SIGINT
User pressed CTRL+C!
Script to handle SIGINT
User pressed CTRL+C!
Script to handle SIGINT
User pressed CTRL+C!
Script to handle SIGINT
User pressed CTRL+C!
Script to handle SIGINT
User pressed CTRL+C!
Script to handle SIGINT
User pressed CTRL+C!