[英]python cmd.Cmd dynamically add a command
我正在嘗試構建一個 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 未綁定方法中獲取底層函數並使用它。” 我提到這一點是因為有時有充分的理由像這樣使用深黑巫術。 但是您描述的用例似乎不適合這里,例如,如果您向MyExtraCmds
添加了額外的類變量並期望do_showmore
能夠訪問它們,則可能會非常混亂。 您從MyExtraCmds
並添加到MyCmd
將不再了解MyExtraCmds
因此會產生誤導和混淆。
對我來說,當我用相等運算符設置它時它就起作用了。 它確實作為一個有效的命令工作。
p = MyCmd()
p.do_extra = extra_command
p.cmdloop()
我找到了一種解決方法,使其適用於自動完成和幫助。 重新實現get_names()在你的類(我不知道為什么他們用自己一流的,而不是自我存在)
class MyCmd(cmd.Cmd):
def get_names(self):
return dir(self)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.