繁体   English   中英

如何在Python中执行多级CLI?

[英]How to do a multi-level CLI in Python?

我正在尝试使用CLI编写,最好用Python编写。 我需要一个多级CLI,我想要标签完成。

我查看了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 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_2解释器会为您提供subcommand_1subcommand_2subcommand_3quit quit将您带回主翻译,EOF角色也是如此。

来自pypi的argpext模块实现了命令行界面的多级子命令。 标签完成没有支持(但是?)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM