我有一个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()
但我不知道该怎么做,因为如果命令是未知的,应用程序就会退出(我想在任何东西可以捕捉到它之前,一个非常天真的方法)。
如果有任何帮助,我将不胜感激。
嗨,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
希望能帮到你