我想在我的脚本中处理正确的 CTRL + C ,我一直在阅读一些例子,但我无法实现确定性行为。 例如,给出以下脚本:
1 import signal
2 import time
3
4 def sigint_handler(signum, frame):
5 raise Exception('captured ctrl+c')
6
7 signal.signal(signal.SIGINT, sigint_handler)
8
9 c = True
10 while c:
11 try:
12 pass
13 except KeyboardInterrupt as e:
14 print 'captured keyboardexception'
15 print str(e)
16 except Exception as e:
17 print 'captured exception'
18 print str(e)
19 c = False
我可以获得这两种不同的输出
$ python ctrlc.py
^Ccaptured exception
captured ctrl+c
$ python ctrlc.py
^CTraceback (most recent call last):
File "ctrlc.py", line 12, in <module>
pass
File "ctrlc.py", line 5, in sigint_handler
raise Exception('captured ctrl+c')
Exception: captured ctrl+c
我尝试了不同的配置,也有双重异常处理和没有信号处理但是你总能得到不同的beahaviours击中 CTRL + C
答案 0 :(得分:1)
我建议回复CTRL_C_EVENT
signal:
与CTRL + C击键事件对应的信号。此信号只能与os.kill()一起使用。
答案 1 :(得分:1)
经典的竞争条件。你的循环展开,看起来像这样:
while True:
....
try:
pass <-----
....
while True: <-----
....
try:
pass
在箭头之间的时间内,您实际上不在try / except子句中。所以你应该期待两种不同的行为。
试试这个:
try:
while True:
pass
except....