6

我正在尝试做一个 CLI,最好用 Python 编写。我需要一个多级 CLI,并且我想要 tab 补全。

我查看了 cmd 模块(来自 Python 标准库)和带有“完成”功能的 readline(用于制表符完成)。

他们都缺乏一些东西,即我还没有弄清楚如何处理多个级别,例如:

level1
level2
    level2_subcommand_1
    level2_subcommand_2
level3
    level3_subcommand_1

示例:如果我输入:

cmd> level2

,我想看到按tab键的时候出现level2_subcommand_1和level2_subcommand_2,但是没有level1也没有level3。

我无法使用 cmd lib 和 readline 这样做。

4

2 回答 2

13

它对我来说非常适合cmdPython 2.6.5 中的模块。这是我用来测试的示例代码:

import cmd

class MyInterpreter(cmd.Cmd):
    def do_level1(self, args):
        pass

    def do_level2_subcommand_1(self, args):
        pass

    def do_level2_subcommand_2(self, args):
        pass

    def do_level3_subcommand_1(self, args):
        pass

MyInterpreter().cmdloop()

当我在命令行上键入“level2”然后按 Tab 时,该行将扩展为,level2_subcommand_因为这是所有完成建议的公共前缀。当我再次按 Tab 而不输入任何内容时,下一行正确显示level2_subcommand_1level2_subcommand_2. 这是你想要的?

子命令的另一个变体是为它们创建一个子解释器:

class SubInterpreter(cmd.Cmd):
    prompt = "(level2) "

    def do_subcommand_1(self, args):
        pass

    def do_subcommand_2(self, args):
        pass

    def do_quit(self, args):
        return True
    do_EOF = do_quit

class MyInterpreter(cmd.Cmd):
    def do_level1(self, args):
        pass

    def do_level2(self, args):
        sub_cmd = SubInterpreter()
        sub_cmd.cmdloop()

    def do_level3(self, args):
        pass

上面的变体给你level1,level2level3在你的“主要”解释器中。当您level2在主解释器中调用时,它会构造子解释器并调用其命令循环。副口译员的提示与主口译员不同,因此您始终可以分辨出您所在的口译员。然后副口译员会为您提供subcommand_1subcommand_2和。带您回到主解释器,EOF 字符也是如此。subcommand_3quitquit

于 2010-10-19T15:08:26.317 回答
0

来自 pypi 的 argpext 模块为命令行界面实现了多级子命令。不支持制表符完成(还没有?)。

于 2013-03-16T21:20:23.367 回答