【问题标题】:Aliases for commands with Python cmd module带有 Python cmd 模块的命令的别名
【发布时间】:2016-09-16 05:17:30
【问题描述】:

如何在使用cmd 模块实现的面向行的命令解释器中为命令创建别名?

要创建命令,我必须实现do_cmd 方法。但是我有长名称的命令(如constraint),我想为这些命令(如co)提供别名(实际上是快捷方式)。我该怎么做?

我想到的一种可能性是实现do_alias(如do_co)方法并在此方法中调用do_cmddo_constraint)。但这在 CLI 的帮助下为我带来了新的命令。

还有其他方法可以实现吗?或者有没有办法隐藏来自help 输出的命令?

【问题讨论】:

  • 请注意,在使用 Linux/Unix 时,您应该可以使用命令完成功能(使用 TAB 键)。
  • help_cmd(self): pass隐藏来自help的命令。

标签: python python-3.x


【解决方案1】:

您可以覆盖default 方法并搜索合适的命令处理程序(正如Brian 已经建议的那样):

import cmd

class WithAliasCmd(cmd.Cmd):

    def default(self, line):
        cmd, arg, line = self.parseline(line)
        func = [getattr(self, n) for n in self.get_names() if n.startswith('do_' + cmd)]
        if func: # maybe check if exactly one or more elements, and tell the user
            func[0](arg)

【讨论】:

  • 别忘了添加像return func[0](arg)这样的return语句。
【解决方案2】:

以下解决方案使别名命令共享单个帮助消息。它使您可以将所有别名保存在一个易于编辑的位置,同时使文档变得更加容易。它根据别名 dictionary with function values 检查用户输入并覆盖 default()参见 slothbrian)和 do_help() 方法。

在这里,我创建了别名 'c''con' 执行 do_constraint()'q' 调用 do_quit()'h' 调用 do_help()。这个解决方案的好处是'h q''help quit' 打印相同的消息。多个别名命令的文档可以保存在一个文档字符串中。

import cmd

class prompt(cmd.Cmd):

    def __init__(self):
        cmd.Cmd.__init__(self)
        self.aliases = { 'c'   : self.do_constraint ,
                         'con' : self.do_constraint ,
                         'q'   : self.do_quit       ,
                         'h'   : self.do_help       }

    def do_constraint(self, arg):
        '''Constrain things.'''
        print('Constraint complete.')

    def do_quit(self, arg):
        '''Exit the program.'''
        return True

    def do_help(self, arg):
        '''List available commands.'''
        if arg in self.aliases:
            arg = self.aliases[arg].__name__[3:]
        cmd.Cmd.do_help(self, arg)

    def default(self, line):
        cmd, arg, line = self.parseline(line)
        if cmd in self.aliases:
            self.aliases[cmd](arg)
        else:
            print("*** Unknown syntax: %s" % line)

【讨论】:

  • 这很好用。谢谢分享。我看到的一个问题是自定义命令完成不起作用,例如一个 complete_constraint 方法。
  • 解决方法:complete_con = complete_constraint。命令和帮助的工作方式相同,但您可以拥有完整的定义。
  • 在 default() 中,您需要从别名命令返回值。 do_quit() 没有它就无法工作,因为 cmdloop() 需要一些评估为 True 的东西才能停止。
【解决方案3】:

文档提到了一种默认方法,您可以覆盖该方法来处理任何未知命令。将其编码为前缀扫描命令列表并按照您对 do_alias 的建议调用它们。

【讨论】:

  • +1 是的,恕我直言,这是正确的做法。我添加了一个简单的example
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 2013-10-04
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多