Как избежать исключения Python при обработке 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()

Как я могу заблокировать это ниже исключение, выдаваемое самим питоном при выполнении кода:

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

1 ответ

Решение

Эта проблема, похоже, связана с тем, что принимаются разные сигналы и возникают разные ошибки. Смотрите также это может быть для справки. Обходной путь, который я мог придумать, заключался в том, чтобы перехватить и проигнорировать 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!
Другие вопросы по тегам