0

我正在使用该cmd模块并有一个名为server(method 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()

不幸的是,这是不可能的。

4

1 回答 1

0

相关信息可以在这里找到

子命令的自动完成

解释器能够处理命令名称的完成,但对于命令参数,您必须帮助它。对于命令 xxx,这是通过定义一个 complete_xxx 方法来完成的。例如,如果您定义了一个颜色命令,则该命令的完成方法可能是:

_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 is 是当前输入行 begidx 是要匹配的文本行的开始索引 endidx 是要匹配的文本行的结束索引 It应该返回代表可能完成的字符串列表(可能为空)。当完成取决于参数的位置时,参数 begidx 和 endidx 很有用。

help对于子命令

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

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

这并不完美,因为帮助将被归类为undocumented commands但它是用于争论的。但也许还是比什么都好。

于 2019-07-10T19:12:03.727 回答