2

我有一些 python 代码可以尝试让 raw_input 捕获键盘中断。如果我在这个函数中运行代码,它工作得很好。但是如果我在我的程序中运行它,打印语句永远不会发出,表明键盘中断没有被捕获。该程序尝试退出并失败,直到升级到 SIGKILL,这当然可以正常工作。我的猜测是在其他地方捕获了键盘中断,从而完全阻止了异常运行。我的问题是,这样的中断可能发生在哪里,我怎样才能防止它阻塞这个中断。我的计划是在程序捕获键盘中断和杀死自己之间添加一点延迟,以便在这里给异常一个时间来捕获。

任何想法表示赞赏

谢谢!

import sys
def interruptable_input(text=''):
  '''Takes raw input, but accepts keyboard interrupt'''
  try:
    return raw_input(text)
  except KeyboardInterrupt:
    print "Interrupted by user"
    sys.exit()
4

2 回答 2

2

我已经确定我的问题的原因是另一个中断处理程序在 KeyboardInterrupt 被击中之前杀死了脚本。我通过为 signal.SIGINT 设置我自己的中断处理程序来解决它,如下所示:

import sys
import signal
signal.signal(signal.SIGINT, signal_term_handler)
def signal_term_handler(signal, frame):
  '''Handles KeyboardInterrupts to ensure smooth exit'''
  rospy.logerr('User Keyboard interrupt')
  sys.exit(0)

它稍微不那么直接,但它完成了工作。现在 raw_input() 在被告知时会简单地死掉。

于 2016-03-24T21:52:34.413 回答
2

我把它缩小到以下几点:

import sys
text=''
try:
    print raw_input(text)
except KeyboardInterrupt:
    print "Interrupted by user"
    sys.exit()

当我使用 python 2.7 在命令行上运行它时,它可以完美运行。它让我在控制台上输入一个输入,当我点击 ctrl+c 时,它会被用户中断打印

编辑: 起初我误读了您的问题,但是当我使用您示例中的方法并从另一种方法中调用它时,结果是相同的

于 2016-03-24T15:40:14.787 回答