2010-10-19 23 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模塊實現命令行界面的多級子命令。 有沒有支持標籤完成(還?)。