使用cmd模块:如何将子命令记录在`help`中并与自动完成功能集成?

时间:2019-07-01 08:50:06

标签: python-3.x autocomplete subcommand

我正在使用cmd模块,并有一个名为server(方法do_server())的命令,该命令具有自动完成功能(我在macOS上)。一切都很好,并且按预期方式工作。但是,如果我还想在server命令上使用一个子命令,那么事情就不会像我需要的那样进行。

我需要以下内容:
-子命令也应该与help命令集成在一起(输入help时不应显示,因为它们不是第一级命令,但输入help server时应显示)
-子命令也应与自动完成功能集成

目前,我没有一种现成的定义子命令的方法。我需要将它们作为不理想命令的参数来实现。

我的问题是,我该如何使用help实现子命令的自动文档并具有自动完成功能,以便它与cmd尽可能地集成在一起?

对于此示例,我想更好地集成connect作为子命令:

from cmd import Cmd


class Tansanit(Cmd):

    def do_server(self, args):
        """ Show server info """
        print("Some server details")

        if args and args == "connect":
            print("Connect to the server")

    def do_quit(self, args):
        """ Quit CLI """
        raise SystemExit


if __name__ == '__main__':
    t = Tansanit()
    t.prompt = "> "
    t.cmdloop()

我希望有这样的东西:

from cmd import Cmd


class Tansanit(Cmd):

    def do_server(self, args):
        """ Show server info """
        print("Some server details")

    def do_server_connect(self, args):
        """ Connect to server """
        print("Connect to the server")

    def do_quit(self, args):
        """ Quit CLI """
        raise SystemExit


if __name__ == '__main__':
    t = Tansanit()
    t.prompt = "> "
    t.cmdloop()

不幸的是,这不可能。

1 个答案:

答案 0 :(得分:0)

可以找到相关信息here

子命令的自动完成

  

解释器能够处理命令名称的完成,但是对于命令参数,您将需要帮助。对于命令xxx,这是通过定义complete_xxx方法来完成的。例如,如果您定义了color命令,则该命令的完成方法可以是:

_AVAILABLE_COLORS = ('blue', 'green', 'yellow', 'red', 'black')
def complete_color(self, text, line, begidx, endidx):
    return [i for i in _AVAILABLE_COLORS if i.startswith(text)]
  

complete_xxx方法采用四个参数:

     

text是我们要匹配的字符串,所有返回的匹配必须以它开头   line是当前输入行   begidx是要匹配的文本行中的开始索引   endidx是要匹配的文本行中的结束索引   它应该返回代表可能完成的字符串列表(可能为空)。当完成取决于参数的位置时,参数begidx和endidx很有用。

help(用于子命令)

  

您还可以为与命令无关的主题定义帮助:

def help_introduction(self):
    print 'introduction'
    print 'a good place for a tutorial'

这不是完美的,因为帮助将被归类为undocumented commands,但这只是一个参数。但是也许再好不过了。