對於我來說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