簡體   English   中英

python cmd.Cmd 動態添加命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM