如何在Python中实现多层级命令行界面?

6
我想做一个CLI,最好是用Python编写。我需要一个多级CLI,并且我想要tab键自动完成。
我查看了Python标准库中的cmd模块和readline的“complete”函数(用于tab键自动完成)。
它们都有缺点,即我还没有弄清楚如何处理多个级别,例如:
level1
level2
    level2_subcommand_1
    level2_subcommand_2
level3
    level3_subcommand_1

示例: 如果我输入:

cmd> level2

我希望在按下Tab键时,看到level2_subcommand_1和level2_subcommand_2出现,但不应该有level1和level3。

使用cmd库和readline都无法实现此功能。

2个回答

13

我在Python 2.6.5环境下使用cmd模块时完美运行。以下是我用来测试的示例代码:

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
上述变量会在你的"主"解释器中提供level1level2level3。当你在主解释器中调用level2时,它会构建子解释器并调用其命令循环。子解释器具有与主解释器不同的提示符,因此您始终可以知道自己在哪个解释器中。然后,子解释器会给您提供subcommand_1subcommand_2subcommand_3quitquit将带您回到主解释器,并且EOF字符也会这样做。

嗨,谢谢你的回答。第二个例子看起来似乎可以满足我的需求。我已经进行了修改(它调用SubInterpreter而不是SubInterpreterForLevel2),但是它不起作用。就好像我被困在第一层(MyInterpreter)一样。 - daniel meier
好的,我在一个实际的Python解释器中测试了我的第二个示例。看起来SubInterpreterForLevel2应该被称为SubInterpreter(正如你正确指出的那样),另外do_quit函数缺少了args参数,但除此之外对我来说完全正常工作。输入level2会将提示符更改为(level2)并将我带到子解释器。在(level2)中输入quit会将我带回到(Cmd)。当你输入level2时,你有收到任何错误消息吗? - Tamás

0

argpext模块来自pypi,为命令行界面实现了多级子命令。目前还没有支持Tab键补全的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接