使用原始输入捕获键盘中断

时间:2016-03-24 15:19:23

标签: python raw-input keyboardinterrupt

我有一些python代码试图让raw_input捕获键盘中断。如果我在这个函数中运行代码它完全正常。但是如果我在我的程序中运行它,则永远不会发出print语句,表明没有捕获到键盘中断。该程序尝试退出并失败,直到它升级为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()

2 个答案:

答案 0 :(得分:2)

我已将其缩小到以下内容:

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

当我使用python 2.7在命令行上运行它时,它的工作正常。 它允许我在控制台上输入一个输入,当我按下ctrl + c时,它会被用户输入

修改 我最初误读了你的问题,但是当我使用你的例子中的方法并从另一个方法调用它时,结果是相同的

答案 1 :(得分:1)

我已经确定了我的问题的原因是在敲击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()会在被告知时死亡。