对于我来说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_1
和level2_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
,在你的“主”解释level2
和level3
。当您在主解释器中调用level2
时,它会构造子解释器并调用其命令循环。子译员与主译员有不同的提示,所以你可以随时告诉你是哪位译员。子译员然后给你subcommand_1
,subcommand_2
,subcommand_3
和quit
。 quit
会带你回到主解释器,EOF字符也是如此。
嗨,谢谢你的回答。第二个例子看起来像它可以做我想要的。我修改了它(它调用SubInterpreter而不是SubInterpreterForLevel2),但它不起作用。这就像我卡在第一级(MyInterpreter)。 – 2010-10-20 07:01:08
好的,我在一个实际的Python解释器中测试了我的第二个示例。看起来像“SubInterpreterForLevel2”应该被称为“SubInterpreter”(正如你正确指出的那样),加上'do_quit'函数缺少'args'参数,否则它对我来说工作得很好。键入'level2'会将提示改为'(level2)',并将我带到子解释器。在'(level2)'中键入'quit'使我回到'(Cmd)'。当你输入'level2'时,你是否收到错误信息? – 2010-10-20 08:26:58