Python 2.7 ctrl + c不确定行为

时间:2013-10-22 13:24:36

标签: python python-2.7 signals

我想在我的脚本中处理正确的 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

2 个答案:

答案 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....