【问题标题】:How to do a multi-level CLI in Python?如何在 Python 中做一个多级 CLI?
【发布时间】:2010-10-19 07:39:18
【问题描述】:

我正在尝试做一个 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 这样做。

【问题讨论】:

    标签: python command-line-interface tab-completion


    【解决方案1】:

    使用 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)。
    • 好的,我在一个实际的 Python 解释器中测试了我的第二个示例。看起来SubInterpreterForLevel2 应该被称为SubInterpreter (正如你正确指出的那样),加上do_quit 函数缺少args 参数,但除此之外它对我来说非常好。键入 level2 会将提示更改为 (level2) 并将我带到子解释器。在(level2) 中输入quit 会将我带回到(Cmd)。输入level2 时是否收到任何错误消息?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-03-23
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 2017-06-25
      • 2013-03-05
      相关资源
      最近更新 更多