首页 > 解决方案 > Click:如何使用 Click 自定义“错误:没有这样的命令 xx”错误处理?

问题描述

我有一个 Click 应用程序,我正在处理它,并且我想在调用未知的命令/子命令时自定义(从而覆盖)Click 的默认行为。

目前只有这个错误消息:Error: No such command xx之后不再执行任何代码。

我的初始设置是这样的:

@click.group(cls=CustomHelpOrder)
@click.option('-v', '--verbose',is_flag=True)
def myapp_cli(verbose):
    if verbose:
         do_verbose()
    else:
         do_not_verbose()


@myapp_cli.command(help_priority=1, short_help='Foo my project')
@click.option('--bar')
def baz(bar: str) -> None:
    """
    Do something

    """
    do_something(bar)

所以我想做的是:

我尝试过, try: myapp_cli() except Click.Exception: handleExc()但我无法弄清楚如何做到这一点,因为如果命令未知,应用程序就会退出(我认为在任何东西都可以捕获它之前;一种非常幼稚的方法)。我想知道我是否必须以某种方式覆盖默认行为,但由于我对 Click 很陌生,我不知道如何。

我会感谢任何帮助。

标签: pythoncommand-line-interfacepython-click

解决方案


嗨法文特,欢迎!

您可以实现自己的自定义组。来自Click 的手册


class AliasedGroup(click.Group):

    def get_command(self, ctx, cmd_name):
        rv = click.Group.get_command(self, ctx, cmd_name)
        if rv is not None:
            return rv
        matches = [x for x in self.list_commands(ctx)
                   if x.startswith(cmd_name)]
        if not matches:
            return None
        elif len(matches) == 1:
            return click.Group.get_command(self, ctx, matches[0])
        ctx.fail('Too many matches: %s' % ', '.join(sorted(matches)))

在上面的代码段中,您可以编辑以下部分来处理您的Command not found情况,但您可以。

if not matches:
    # your custom logic for `Command not found` goes here

希望能帮助到你!


推荐阅读