版本信息:
下面是我玩过的一小段测试代码。其目的是忽略在执行某些代码时按下的CTRL-C
,之后将恢复CTRL-C
行为。
import signal
import time
try:
# marker 1
print('No signal handler modifications yet')
print('Sleeping...')
time.sleep(10)
# marker 2
signal.signal(signal.SIGINT, signal.SIG_IGN)
print('Now ignoring CTRL-C')
print('Sleeping...')
time.sleep(10)
# marker 3
print('Returning control to default signal handler')
signal.signal(signal.SIGINT, signal.SIG_DFL)
print('Sleeping...')
time.sleep(10)
except keyboardInterrupt:
print('Ha, you pressed CTRL-C!')
我在玩这个游戏时观察到的情况:
CTRL-C
在标记1和标记2之间发送的{CTRL-C
在标记2和标记3之间发送的{CTRL-C
在处理标记3之后发送,但将跳转到异常处理程序。相反,Python只会立即终止。另外,考虑一下:
>>>import signal
>>>signal.getsignal(signal.SIGINT)
<built-in function default_int_handler>
>>> signal.getsignal(signal.SIGINT) is signal.SIG_DFL
False
>>> signal.signal(signal.SIGINT, signal.SIG_DFL)
<built-in function default_int_handler>
>>> signal.getsignal(signal.SIGINT) is signal.SIG_DFL
True
因此,最初,虽然信号处理程序被视为默认信号处理程序,但它似乎与SIG_DFL
定义的处理程序不同。
如果有人能对此有所了解,特别是在将信号处理程序还原到SIG_DFL后忽略异常处理程序的情况下。
Python安装自己的
SIGINT
处理程序以引发KeyboardInterrupt
异常。将信号设置为SIG_DFL
不会还原该处理程序,而是还原系统本身的“标准”处理程序(它终止解释器)。完成后,必须存储原始处理程序并还原该处理程序:
正如评论中恰如其分地说的,您可以将其表示为context manager:
你可以这样使用它:
相关问题 更多 >
编程相关推荐