<p>我已经写了一个你想要的工作版本。您应该重写<code>cmdloop</code>和{<cd2>}类的方法。在</p>
<p>我为<code>cmdloop</code>方法中的键盘中断处理定义了一个新关键字:</p>
<pre><code>if self.use_rawinput:
try:
line = input(self.prompt)
except EOFError:
line = "EOF"
except KeyboardInterrupt:
line = "ctrl_c" # You can handle the `KeyboardInterrupt` exception through this keyword.
</code></pre>
<p>我在<code>onecmd</code>方法中处理了这个关键字。如果<code>line</code>变量包含此关键字,则该方法将向STDOUT写入一个<code>\n</code>并返回。在</p>
^{pr2}$
<p>您可以在下面看到完整的代码工作代码:</p>
<pre><code>#! /usr/bin/python
# -*- coding: utf-8 -*-
from cmd import Cmd
class MyPrompt(Cmd):
@staticmethod
def do_exit(*args):
return True
def cmdloop(self, intro=None):
"""Repeatedly issue a prompt, accept input, parse an initial prefix
off the received input, and dispatch to action methods, passing them
the remainder of the line as argument.
"""
self.preloop()
if self.use_rawinput and self.completekey:
try:
import readline
self.old_completer = readline.get_completer()
readline.set_completer(self.complete)
readline.parse_and_bind(self.completekey + ": complete")
except ImportError:
pass
try:
if intro is not None:
self.intro = intro
if self.intro:
self.stdout.write(str(self.intro) + "\n")
stop = None
while not stop:
if self.cmdqueue:
line = self.cmdqueue.pop(0)
else:
if self.use_rawinput:
try:
line = input(self.prompt)
except EOFError:
line = "EOF"
except KeyboardInterrupt:
line = "ctrl_c"
else:
self.stdout.write(self.prompt)
self.stdout.flush()
line = self.stdin.readline()
if not len(line):
line = "EOF"
else:
line = line.rstrip("\r\n")
line = self.precmd(line)
stop = self.onecmd(line)
stop = self.postcmd(stop, line)
self.postloop()
finally:
if self.use_rawinput and self.completekey:
try:
import readline
readline.set_completer(self.old_completer)
except ImportError:
pass
def onecmd(self, line):
"""Interpret the argument as though it had been typed in response
to the prompt.
This may be overridden, but should not normally need to be;
see the precmd() and postcmd() methods for useful execution hooks.
The return value is a flag indicating whether interpretation of
commands by the interpreter should stop.
"""
cmd, arg, line = self.parseline(line)
if not line:
return self.emptyline()
if cmd is None:
return self.default(line)
self.lastcmd = line
if line == "EOF":
self.lastcmd = ""
if line == "ctrl_c":
self.stdout.write("\n")
return
if cmd == "":
return self.default(line)
else:
try:
func = getattr(self, "do_" + cmd)
except AttributeError:
return self.default(line)
return func(arg)
p = MyPrompt()
p.cmdloop()
</code></pre>
<p>输出:</p>
<pre><code>python3 test_cmd.py
(Cmd) test
*** Unknown syntax: test
(Cmd) test1
*** Unknown syntax: test1
(Cmd) test2 < Ctrl+C has been pushed and I got a new empty prompt
(Cmd) test3 < Ctrl+C has been pushed and I got a new empty prompt
(Cmd) < I got a new empty prompt
</code></pre>
<p>希望你能帮我解决问题。在</p>