2010-10-19 67 views
4

我想要做一个CLI,最好用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。

回答

10

对于我来说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() 

当我键入命令行“级别2”,然后按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,subcommand_3quitquit会带你回到主解释器,EOF字符也是如此。

+0

嗨,谢谢你的回答。第二个例子看起来像它可以做我想要的。我修改了它(它调用SubInterpreter而不是SubInterpreterForLevel2),但它不起作用。这就像我卡在第一级(MyInterpreter)。 – 2010-10-20 07:01:08

+0

好的,我在一个实际的Python解释器中测试了我的第二个示例。看起来像“SubInterpreterForLevel2”应该被称为“SubInterpreter”(正如你正确指出的那样),加上'do_quit'函数缺少'args'参数,否则它对我来说工作得很好。键入'level2'会将提示改为'(level2)',并将我带到子解释器。在'(level2)'中键入'quit'使我回到'(Cmd)'。当你输入'level2'时,你是否收到错误信息? – 2010-10-20 08:26:58

0

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