首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用原始输入捕获键盘中断

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

Stack Overflow用户
提问于 2016-03-24 23:19:23
回答 2查看 7.1K关注 0票数 2

我有一些python代码可以尝试让raw_input捕捉键盘中断。如果我运行这个函数中的代码,它可以很好地工作。但是,如果我在我的程序中运行它,就永远不会执行print语句,这表明键盘中断没有被捕获。程序试图退出,但失败了,直到它升级到SIGKILL,SIGKILL当然工作正常。我的猜测是在其他地方捕捉到了键盘中断,从而阻止了异常的运行。我的问题是,这样的中断可能发生在哪里,以及我如何防止它阻止这个中断。我的计划是在程序捕获键盘中断和终止自身之间增加一个小小的延迟,以便让excepting捕获一个时刻。

有什么好点子吗?

谢谢!

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2016-03-24 23:40:15

我已经将其范围缩小到以下几点:

代码语言:javascript
复制
import sys
text=''
try:
    print raw_input(text)
except KeyboardInterrupt:
    print "Interrupted by user"
    sys.exit()

当我使用python2.7在命令行上运行它时,它工作得很好。它允许我在控制台上键入输入,当我点击ctrl+c时,它会打印用户输入的内容

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

票数 2
EN

Stack Overflow用户

发布于 2016-03-25 05:52:34

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

代码语言:javascript
复制
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()将在被告知时简单地终止。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36203740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档