【发布时间】:2012-02-07 10:56:32
【问题描述】:
在使用 python 的 cmd.Cmd 创建自定义 CLI 时,如何告诉处理程序中止当前行并给我一个新提示?
这是一个最小的例子:
# console_min.py
# run: 'python console_min.py'
import cmd, signal
class Console(cmd.Cmd):
def __init__(self):
cmd.Cmd.__init__(self)
self.prompt = "[test] "
signal.signal(signal.SIGINT, handler)
def do_exit(self, args):
return -1
def do_EOF(self, args):
return self.do_exit(args)
def preloop(self):
cmd.Cmd.preloop(self)
self._hist = []
self._locals = {}
self._globals = {}
def postloop(self):
cmd.Cmd.postloop(self)
print "Exiting ..."
def precmd(self, line):
self._hist += [ line.strip() ]
return line
def postcmd(self, stop, line):
return stop
def emptyline(self):
return cmd.Cmd.emptyline(self)
def handler(self, signum, frame):
# self.emptyline() does not work here
# return cmd.Cmd.emptyline(self) does not work here
print "caught ctrl+c, press return to continue"
if __name__ == '__main__':
console = Console()
console.cmdloop()
非常感谢您的进一步帮助。
原始问题和更多详细信息: [目前以下建议已被整合到这个问题中——仍在寻找答案。已更新以修复错误。]
我已经尝试将处理程序移动到循环外的函数中,看看它是否更灵活,但似乎没有。
我正在使用 python 的cmd.Cmd module 创建我自己的命令行解释器来管理与某些软件的交互。我经常按 ctrl+c 期待流行的类似 shell 的行为,即返回一个新的提示而不对输入的任何命令进行操作。但是,它只是退出。我试图在代码中的各个点(预循环等)捕获 KeyboardInterrupt 异常,但无济于事。我在sigints 上读过一些文章,但不太清楚它如何适合这里。
更新:根据下面的建议,我尝试实现信号并且能够这样做,这样 ctrl+c 现在不会退出 CLI,但会打印消息。但是,我的新问题是我似乎无法告诉处理函数(见下文)在打印之外做很多事情。我希望 ctrl+c 基本上中止当前行并给我一个新的提示。
【问题讨论】:
标签: python