我正在尝试构建一个cli框架,其中需要动态地添加命令。我想要实现的是-我将有一个继承自cmd.Cmd的最小类,稍后我将在单独的类中编写命令,并与主类一起加载这些命令。
下面是我尝试过的,但是在尝试执行命令showmore时,它会抛出TypeError
import cmd
class MyExtraCmds(cmd.Cmd):
def do_showmore(self, *args):
print (type(self))
print ("Show more command")
class MyCmd(cmd.Cmd):
def __init__(self, target=None, user=None, passwd=None):
cmd.Cmd.__init__(self)
def do_show(self, *args):
print (type(self))
print ("Show command")
def do_EOF(self, line):
return True
if __name__ == "__main__":
setattr( MyCmd, 'do_showmore', MyExtraCmds.do_showmore)
print (dir(MyCmd))
target = MyCmd()
target.cmdloop()发布于 2015-08-09 02:00:50
编辑2:我想你一定是在使用Python 2,因为在Python 3中,这只是起作用.
MyExtrasCommand是一个不同的类,所以这是行不通的,因为对于普通的InstanceMethod,第一个参数必须是类的一个实例。
但是Python类是打开的,以后可以添加到它们中。最简单的方法是从当前不在类中的方法开始,然后在运行时正确地将它们添加到类中。例如,这将很好地工作:
import cmd
def do_showmore(self, *args):
print (type(self))
print ("Show more command")
class MyCmd(cmd.Cmd):
def __init__(self, target=None, user=None, passwd=None):
cmd.Cmd.__init__(self)
def do_show(self, *args):
print (type(self))
print ("Show command")
def do_EOF(self, line):
return True
if __name__ == "__main__":
setattr( MyCmd, 'do_showmore', do_showmore)
print (dir(MyCmd))
target = MyCmd()
target.cmdloop()如果您打印MyCmd.do_showmore的类型,您将看到您的函数已正确包装到一个InstanceMethod中。
编辑(只为获取信息-您可能并不想这样做.)
因为Python中的所有内容都是开放的和可检查的,所以您可以通过更改一行来使初始方法工作。以下内容将在Python2.7中使用:
setattr( MyCmd, 'do_showmore', MyExtraCmds.do_showmore.im_func)对于Python2.7,将.im_func添加到该行末尾时表示“从MyExtraCmds.do_showmore解绑定方法获取底层函数并使用它”。我之所以提到这一点,是因为有时有充分的理由像这样使用深黑伏都教。但是您所描述的用例似乎不适合在这里使用,而且如果您向MyExtraCmds中添加了额外的类变量并期望do_showmore能够访问它们,则可能会非常混乱。您从MyExtraCmds中删除并添加到MyCmd中的函数将不再具有任何MyExtraCmds知识,因此这将是误导和混淆的。
发布于 2020-05-31 09:29:31
对我来说,当我用相等的操作符设置它时,它是有效的。它确实是一个有效的命令。
p = MyCmd()
p.do_extra = extra_command
p.cmdloop()我找到了一个解决办法,让它在自动完成和帮助中工作。在类中重新实现get_names() (我不知道他们为什么使用self .类而不是self)
class MyCmd(cmd.Cmd):
def get_names(self):
return dir(self)https://stackoverflow.com/questions/31900083
复制相似问题