gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:16:43 24 4
gpt4 key购买 nike

我正在尝试使用 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)

观察:

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

问题:

实际命令的自动完成功能不可用。

当点击“some”和 tab 时,shell 的预期行为是将其自动补全为“something”。这不会发生。

当我尝试调试该问题时,我发现 self.completenames() 函数使用的 self.get_names() 方法返回以下列表注册前的方法。

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

我希望对此有一些见解。

谢谢!

最佳答案

您可以通过扩展 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

关于嵌套解释器中的 python Cmd 模块自动完成错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33593743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com