如何干净地退出cmd模块的命令循环

10 投票
2 回答
11524 浏览
提问于 2025-04-17 19:49

我正在用Python的cmd模块来制作一个简单的命令行互动程序。不过,从这个文档来看:http://docs.python.org/2/library/cmd.html,我不太清楚怎么才能干净利落地退出这个程序(也就是cmd循环)。

理想情况下,我希望在提示符下输入一个命令exit,这样就能退出程序。

2 个回答

0

另外一种解决方法就是简单地抛出一个自定义的异常,然后捕获它。

import cmd

class ExitCmdException(Exception):
    pass #Could do something but just make a simple exception

class myCmd(cmd.Cmd):
    #...
    def do_quit(self, args):
        """ Quits the command loop """
        raise ExitCmdException()

#...
try:
    foo.cmdloop()
except ExitCmdException as e:
    print('Good Bye')

14

你需要重写一下 postcmd 这个方法:

Cmd.postcmd(stop, line)

这个方法是在一个命令执行完之后被调用的。它在 Cmd 类里是个空壳,主要是为了让子类去实现。这里的 line 是刚刚执行的命令行,而 stop 是一个标志,表示在调用 postcmd() 之后是否要停止执行;这个标志的值是由 onecmd() 方法返回的。这个方法的返回值会作为一个内部标志的新值,和 stop 对应;如果返回 false,就会继续执行后面的内容。

还有来自 cmdloop 的文档说明:

这个方法会在 postcmd() 方法返回 true 值时结束。传给 postcmd() 的 stop 参数是对应命令的 do_*() 方法的返回值。

换句话说:

import cmd
class Test(cmd.Cmd):
    # your stuff (do_XXX methods should return nothing or False)
    def do_exit(self,*args):
        return True

撰写回答