我使用 cmd 模块编写了一个 Python 3.5 应用程序。我想实现的最后一件事是正确处理 CTRL-C (sigint) 信号。我希望它的行为或多或少像 Bash 那样:
- 在光标所在的点打印 ^C
- 清除缓冲区以便删除输入文本
- 跳到下一行,打印提示,等待输入
基本上:
/test $ bla bla bla|
# user types CTRL-C
/test $ bla bla bla^C
/test $
这是作为可运行示例的简化代码:
import cmd
import signal
class TestShell(cmd.Cmd):
def __init__(self):
super().__init__()
self.prompt = '$ '
signal.signal(signal.SIGINT, handler=self._ctrl_c_handler)
self._interrupted = False
def _ctrl_c_handler(self, signal, frame):
print('^C')
self._interrupted = True
def precmd(self, line):
if self._interrupted:
self._interrupted = False
return ''
if line == 'EOF':
return 'exit'
return line
def emptyline(self):
pass
def do_exit(self, line):
return True
TestShell().cmdloop()
这几乎可以工作。当我按 CTRL-C 时,^C 会打印在光标处,但我仍然必须按 Enter。然后,该precmd
方法注意到self._interrupted
处理程序设置的标志,并返回一个空行。这是我所能接受的,但我想以某种方式不必按该输入。
我想我需要以某种方式强制input()
返回,有人有想法吗?