首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python cmd.Cmd动态添加命令

python cmd.Cmd动态添加命令
EN

Stack Overflow用户
提问于 2015-08-09 01:20:01
回答 2查看 1.6K关注 0票数 2

我正在尝试构建一个cli框架,其中需要动态地添加命令。我想要实现的是-我将有一个继承自cmd.Cmd的最小类,稍后我将在单独的类中编写命令,并与主类一起加载这些命令。

下面是我尝试过的,但是在尝试执行命令showmore时,它会抛出TypeError

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2015-08-09 02:00:50

编辑2:我想你一定是在使用Python 2,因为在Python 3中,这只是起作用.

MyExtrasCommand是一个不同的类,所以这是行不通的,因为对于普通的InstanceMethod,第一个参数必须是类的一个实例。

但是Python类是打开的,以后可以添加到它们中。最简单的方法是从当前不在类中的方法开始,然后在运行时正确地将它们添加到类中。例如,这将很好地工作:

代码语言:javascript
复制
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中使用:

代码语言:javascript
复制
setattr(  MyCmd, 'do_showmore', MyExtraCmds.do_showmore.im_func)

对于Python2.7,将.im_func添加到该行末尾时表示“从MyExtraCmds.do_showmore解绑定方法获取底层函数并使用它”。我之所以提到这一点,是因为有时有充分的理由像这样使用深黑伏都教。但是您所描述的用例似乎不适合在这里使用,而且如果您向MyExtraCmds中添加了额外的类变量并期望do_showmore能够访问它们,则可能会非常混乱。您从MyExtraCmds中删除并添加到MyCmd中的函数将不再具有任何MyExtraCmds知识,因此这将是误导和混淆的。

票数 1
EN

Stack Overflow用户

发布于 2020-05-31 09:29:31

对我来说,当我用相等的操作符设置它时,它是有效的。它确实是一个有效的命令。

代码语言:javascript
复制
p = MyCmd()
p.do_extra = extra_command
p.cmdloop()

我找到了一个解决办法,让它在自动完成和帮助中工作。在类中重新实现get_names() (我不知道他们为什么使用self .而不是self)

代码语言:javascript
复制
class MyCmd(cmd.Cmd):
  def get_names(self):
    return dir(self)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31900083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档