嵌套解释器中的python Cmd模块自动完成错误

时间:2015-11-08 12:05:30

标签: python python-2.7

我正在尝试使用Cmd模块为主控制台创建调试控制台。

调试控制台应具有所有主控制台属性,并且还有一些用于调试和高级用户的扩展。

满足我需求的最佳答案是以下帖子的第二个答案: object inheritance and nested cmd

我的实施目前看起来像这样:

<html>

<head>
  <title>Live Text Sync</title>
  <meta charset="utf-8" />
</head>

<body>
  <textarea id="a"></textarea>
  <textarea id="b"></textarea>
  <script>
    var a = document.getElementById("a");
    var b = document.getElementById("b");
    a.oninput = function(e) {
      b.value = a.value;
    }
  </script>
</body>

</html>

观察:

当我点击“帮助”时,我确实看到了所有上层控制台方法,我可以调用它们。

问题:

无法自动完成实际命令。

命中“some”和tab时shell的预期行为是将其自动完成为“某事”。这不会发生。

当我尝试调试该问题时,我发现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) 函数使用的self.get_names()方法在注册之前返回方法列表。

所以实际发生的是新添加的方法从嵌套控制台“删除”,尽管我可以调用它们。

我喜欢这方面的一些见解。

谢谢!

1 个答案:

答案 0 :(得分: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的子序列版本上工作,因为它是python 2.7的未记录的行为

编辑:将mainconsole的子类化方法替换为评论中所需的成员

编辑2 :不要替换SubConsole中的现有方法,以保持方法为do_help