2015-11-08 54 views
1

我正在嘗試爲我使用Cmd模塊編寫的主控制檯創建一個調試控制檯。嵌套解釋器中的python Cmd模塊自動完成錯誤

調試控制檯應該具有所有主控制檯屬性,並且在調試和高級用戶的使用上有更多的擴展。

的最佳答案杉我的需求是以下後的第二個答案: object inheritance and nested cmd

我的實現目前看起來是這樣的:

class MainConsole(cmd.Cmd): 
    def __init__(self): 
     cmd.Cmd.__init__(self) 

    def do_something(self, line): 
     print "do something!" 
     return 

    def do_something2(self, line): 
     print "do something2!" 
     return  

class SubConsole1(cmd.Cmd): 
    def __init__(self, maincon): 
     cmd.Cmd.__init__(self) 
     self.maincon = maincon 
     self.register_main_console_methods() 

    def register_main_console_methods(self): 
     main_names = self.maincon.get_names() 
     for name in main_names: 
      if (name[:3] == 'do_') or (name[:5] == 'help_') or (name[:9] == 'complete_'): 
       self.__dict__[name] = getattr(self.maincon, name) 

觀察:

當我點擊「幫助」,我確實看到了所有上層控制檯方法,並且能夠調用它們。

問題:

的實際命令的自動完成不可用。

shell打擊「some」和tab時的預期行爲是將其自動完成爲「某事」。這不會發生。

當我試圖調試該問題時,我發現self.get_names()方法使用的self.completenames()函數返回註冊之前的方法列表。

所以實際發生的是新添加的方法從嵌套控制檯「移除」,儘管我可以調用它們。

我很想談談這方面的一些見解。

謝謝!

回答

1

您可以通過擴展get_names方法

import cmd 

class MainConsole(cmd.Cmd): 
    def __init__(self,console_id): 
     cmd.Cmd.__init__(self) 
     self.console_id = console_id 
    def do_something(self, line): 
     print "do something!",self.console_id 
     return 

    def do_something2(self, line): 
     print "do something2!",self.console_id 
     return  

class SubConsole1(cmd.Cmd): 

    def __init__(self, maincon): 
     cmd.Cmd.__init__(self) 
     self.maincon = maincon 
     self.register_main_console_methods() 

    def do_super_commands(self,line): 
     print "do supercommand",self.maincon 

    def register_main_console_methods(self): 
     main_names = dir(self.maincon) 
     for name in main_names: 
      for prefix in 'do_','help_','complete_', : 
       if name.startswith(prefix) and name not in dir(self): 
        self.__dict__[name] = getattr(self.maincon, name) 

    def get_names(self): 
     result = cmd.Cmd.get_names(self) 
     result+=self.maincon.get_names() 
     return result 

SubConsole1(MainConsole("mainconsole")).cmdloop() 

它不能保證對蟒蛇的子版本一起解決你的問題,因爲它是Python 2.7版

編輯的無證行爲:更換子類化方法由mainconsole作爲成員根據要求註釋

編輯2:不要取代存在g在SubConsole中的方法保持方法爲do_help

+0

嗨@Xavier,謝謝你的回答。這個解決方案對我來說不起作用,因爲主控制檯擁有一個連接到服務器和一些邏輯的客戶端實例。所以我真的想要利用主控制檯實例。 – cyber101

+0

謝謝,它的工作原理。但是現在,本地「do_」方法在幫助菜單中不存在(雖然可以調用),但其幫助不可用。 – cyber101

+0

發生了什麼是'do_help'方法被替換,所以調用的方法是'MainConsole' –