Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅捕获*一个*键盘中断异常_Python_Unix_Exception_Keyboardinterrupt - Fatal编程技术网

Python 仅捕获*一个*键盘中断异常

Python 仅捕获*一个*键盘中断异常,python,unix,exception,keyboardinterrupt,Python,Unix,Exception,Keyboardinterrupt,我有一个长时间运行的任务,该任务可能会被中断,因为在它内部引发异常,或者因为按下Control+C发出SIGINT,引发KeyboardInterruptException 在这两种情况下,要遵循的路径是存储任务已经处理的结果,以防止计算时间的损失。此存储需要一些时间,因为它可能需要处理大量信息。当中断已被捕获时,再次按下Control+C时出现问题 例如: task=SomeTask() 尝试: task.start() 除键盘中断例外: 打印(“键盘中断”) 例外情况除外,如e: 打印例外(

我有一个长时间运行的任务,该任务可能会被中断,因为在它内部引发异常,或者因为按下Control+C发出
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进入,然后禁用中断:)谢谢