Python 单击多个命令名称

标签 python command alias python-click

是否可以用 Python Click 做这样的事情?

@click.command(name=['my-command', 'my-cmd'])
def my_command():
    pass

我希望我的命令行是这样的:

mycli my-command

mycli my-cmd 

但引用相同的函数。

我需要做类似 AliasedGroup 的类(class)吗? ?

最佳答案

AliasedGroup不是你想要的,因为它允许最短的前缀匹配,而且你似乎需要实际的别名。但该示例确实提供了可行方向的提示。它继承自 click.Group并覆盖某些行为。

这是实现您所追求的目标的一种方法:

自定义类

这个类覆盖了 click.Group.command()用于修饰命令函数的方法。它增加了传递命令别名列表的能力。此类还添加了一个简短的帮助,它引用了别名命令。

class CustomMultiCommand(click.Group):

    def command(self, *args, **kwargs):
        """Behaves the same as `click.Group.command()` except if passed
        a list of names, all after the first will be aliases for the first.
        """
        def decorator(f):
            if isinstance(args[0], list):
                _args = [args[0][0]] + list(args[1:])
                for alias in args[0][1:]:
                    cmd = super(CustomMultiCommand, self).command(
                        alias, *args[1:], **kwargs)(f)
                    cmd.short_help = "Alias for '{}'".format(_args[0])
            else:
                _args = args
            cmd = super(CustomMultiCommand, self).command(
                *_args, **kwargs)(f)
            return cmd

        return decorator

使用自定义类

通过传递 cls click.group() 的参数装饰器,通过 group.command() 添加到组中的任何命令可以传递命令名称列表。

@click.group(cls=CustomMultiCommand)
def cli():
    """My Excellent CLI"""

@cli.command(['my-command', 'my-cmd'])
def my_command():
    ....

测试代码:

import click

@click.group(cls=CustomMultiCommand)
def cli():
    """My Excellent CLI"""


@cli.command(['my-command', 'my-cmd'])
def my_command():
    """This is my command"""
    print('Running the command')


if __name__ == '__main__':
    cli('--help'.split())

测试结果:

Usage: my_cli [OPTIONS] COMMAND [ARGS]...

  My Excellent CLI

Options:
  --help  Show this message and exit.

Commands:
  my-cmd      Alias for 'my-command'
  my-command  This is my command

关于Python 单击多个命令名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46641928/

相关文章:

python - 在 python 2 和 3 的 spyder 之间切换

python - 在python中提交UVa时始终会出现运行时错误

linux - 创建永久可执行别名

python - 你如何在 Python 中为一个类型起别名?

python - ValueError : need more than 1 value to unpack, django电子邮件错误

python - 你如何在 Jupyter notebook 中换行?

django - django如何注册管理命令

batch-file - 按标签引用卷/驱动器

linux - 我怎样才能显示正确答案?

bash - `rm -f` 要求确认,别名为 `rm -i`