gpt4 book ai didi

python cmd.Cmd 动态添加命令

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

我正在尝试构建一个 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()

最佳答案

编辑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 中的所有内容都是开放且可检查的,因此您可以通过更改一行来使初始方法发挥作用。以下内容将在 Python 2.7 中运行:

setattr(  MyCmd, 'do_showmore', MyExtraCmds.do_showmore.im_func)

对于 Python 2.7,将 .im_func 添加到该行末尾表示“从 MyExtraCmds.do_showmore 未绑定(bind)方法获取底层函数并使用它。”我提到这一点是因为有时有充分的理由使用这样的深暗巫术。但是您描述的用例似乎不适合这里,并且例如,如果您向 MyExtraCmds 添加了额外的类变量和预期的 do_showmore 才能访问它们。您从 MyExtraCmds 中剥离并添加到 MyCmd 中的函数将不再了解 MyExtraCmds,因此会产生误导和困惑。

关于python cmd.Cmd 动态添加命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31900083/

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