我正在尝试使用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()
方法在注册之前返回方法列表。
所以实际发生的是新添加的方法从嵌套控制台“删除”,尽管我可以调用它们。
我喜欢这方面的一些见解。
谢谢!
答案 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