点击 如何用Click自定义 "Error: 如何自定义Click的 "Error: No such command xx "错误处理?

问题描述 投票:0回答:1

我有一个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)

所以我想做的是:

  • 检查上面这个(特殊的)异常是否被引发。(也许如果用户输入 bat 而不是 baz)
  • 如果是,我想保存这个未知的命令(如 bat (而不是只打印默认信息和退出),并将其用于进一步的处理(比如将其传递给各种函数(可能作为一个字符串))

我想... try: myapp_cli() except Click.Exception: handleExc() 但我不知道该怎么做,因为如果命令是未知的,应用程序就会退出(我想在任何东西可以捕捉到它之前,一个非常天真的方法)。

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

python command-line-interface python-click
1个回答
1
投票

嗨,Farwent,欢迎!你可以实现你自己的自定义组。

你可以实现你自己的自定义组。来自 点击的手册:


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

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.