2013-10-22 23 views
1

我想正确的CTRL +Ç我的脚本处理,我一直在阅读一些例子,但我无法实现确定性的行为。 例如,给出以下脚本:的Python 2.7 CTRL + C undeterministic行为

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 

我已经尝试了不同的configs,也有双异常处理和未经处理的信号,但你总能得到不同beahaviours打CTRL +ç

+0

你运行在什么平台? –

回答

1

经典的竞赛条件。你的循环展开,看起来像这样:

while True: 
    .... 
    try: 
     pass  <----- 
    .... 

while True:  <----- 
    .... 
    try: 
     pass 

在箭头之间的时间内,你实际上不在try/except子句中。所以你应该期待两种不同的行为。

试试这个:

try: 
    while True: 
     pass 
except.... 
+0

中处理CTRL_C_EVENT谢谢,我认为这就是我的真实脚本中发生的事情。 ctrl + c在进入try之前被击中 – hithwen

1

我建议应对CTRL_C_EVENT signal

该信号对应于CTRL + C按键事件。该信号只能与os.kill()一起使用。

+0

我不明白,你是什么意思? – hithwen

+0

@hithwen:是不是CTRL + C你想回应的事件? –

+0

理论上我不需要处理任何信号,只是为了捕获KeyboardInterrupt(或Base异常),我在示例中添加了信号处理,以根据执行路径获取不同的消息。我应该在示例 – hithwen