Python 仅捕获*一个*键盘中断异常
我有一个长时间运行的任务,该任务可能会被中断,因为在它内部引发异常,或者因为按下Control+C发出Python 仅捕获*一个*键盘中断异常,python,unix,exception,keyboardinterrupt,Python,Unix,Exception,Keyboardinterrupt,我有一个长时间运行的任务,该任务可能会被中断,因为在它内部引发异常,或者因为按下Control+C发出SIGINT,引发KeyboardInterruptException 在这两种情况下,要遵循的路径是存储任务已经处理的结果,以防止计算时间的损失。此存储需要一些时间,因为它可能需要处理大量信息。当中断已被捕获时,再次按下Control+C时出现问题 例如: task=SomeTask() 尝试: task.start() 除键盘中断例外: 打印(“键盘中断”) 例外情况除外,如e: 打印例外(
SIGINT
,引发KeyboardInterruptException
在这两种情况下,要遵循的路径是存储任务已经处理的结果,以防止计算时间的损失。此存储需要一些时间,因为它可能需要处理大量信息。当中断已被捕获时,再次按下Control+C时出现问题
例如:
task=SomeTask()
尝试:
task.start()
除键盘中断例外:
打印(“键盘中断”)
例外情况除外,如e:
打印例外(e)以显示发生的情况
最后:
task.store_results()#如果在此处按Control-C,则数据会损坏
我需要一种方法来捕获中断,启动存储进程并防止另一个中断发生。只需设置信号处理程序:
import signal
task = SomeTask()
try:
task.start()
except KeyboardInterruptException:
print("Keyboard interrupted")
except Exception as e:
print_exception(e) # To show what happened
finally:
signal.signal(signal.SIGINT, lamda *_: print('Wait!'))
task.store_results() # If Control-C is pressed here, data gets corrupted
来源:建议您在问题中添加和操作系统标签,因为处理
SIGINT
会因您使用的操作系统而异。这对我来说是个好办法。它有较少的副作用,因为它第一次通过try/except进入,然后禁用中断:)谢谢