版本信息:
- 操作系统:Windows 7
- Python版本3.3.5
下面是我正在玩的一小段测试代码。目的是忽略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
之间发送marker 1 and marker 2将由异常处理程序处理(如预期)。
-
CTRL-C
之间发送marker 2 and marker 3被忽略(仍然如预期)
-
CTRL-C
之后发送marker 3已处理但会not跳转到异常处理程序。相反,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
不会恢复该处理程序,而是恢复系统本身的“标准”处理程序(它终止解释器)。
您必须存储原始处理程序并在完成后恢复该处理程序:
original_sigint_handler = signal.getsignal(signal.SIGINT)
# Then, later...
signal.signal(signal.SIGINT, original_sigint_handler)
正如kindall在评论中正确地说的那样,你可以将其表达为上下文管理器 https://docs.python.org/3.4/library/contextlib.html:
from contextlib import contextmanager
@contextmanager
def sigint_ignored():
original_sigint_handler = signal.getsignal(signal.SIGINT)
signal.signal(signal.SIGINT, signal.SIG_IGN)
try:
print('Now ignoring CTRL-C')
yield
except:
raise # Exception is dropped if we don't reraise it.
finally:
print('Returning control to default signal handler')
signal.signal(signal.SIGINT, original_sigint_handler)
你可以这样使用它:
# marker 1
print('No signal handler modifications yet')
print('Sleeping...')
time.sleep(10)
# marker 2
with sigint_ignored():
print('Sleeping...')
time.sleep(10)
# marker 3
print('Sleeping...')
time.sleep(10)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)