Click: How to customize "Error: No such command xx" error handling with Click?

Click: How to customize "Error: No such command xx" error handling with Click?

我有一个正在开发的 Click 应用程序,我想自定义(从而覆盖)当调用未知的 command/subcommand 时 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 还很陌生,所以我不知道该怎么做。

如有任何帮助,我将不胜感激。

您好 Farwent,欢迎光临!

您可以实现自己的自定义组。来自 Click's manual:


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

希望对您有所帮助!