首页 > 解决方案 > 我可以检查一个子命令可以在 Python 中运行吗 在检查选项之前单击

问题描述

我使用 python click 为我的应用程序创建一个带有子命令的 CLI。我有这样的代码:

@click.group()
def cli():
    pass

@cli.command(debug)
@@click.option('--debug/--no-debug', default=False)
def sub1():
    # code doing stuff on a git repo

@cli.command()
@click.option('--yes', type=bool, default=False)
def sub2(yes):
    # code doing other stuff on the git repo

@cli.command()
@click.option('--yes', type=bool, default=False)
def sub3(yes):
    # code doing last stuff on git repo

我的问题是,按照上面的代码,命令的唯一允许顺序是cli sub1 -> cli sub2 -> cli sub3. 这与它在后台运行的 git 代码有关(例如,提交之前需要创建一个分支)。

我想做的是定义一个命令,例如

def check_2():
    # checking cli sub1 was run. 

并在开始时运行它cli sub2以检查cli sub1之前运行的情况(此函数cli sub1通过查看 git repo 状态来确定状态“之前运行”)。

我的问题是我想在解析选项之前运行它(我定义了自己的回调来提示输入,如果丢失)。我不希望用户输入其选项并在之后得到错误。

一个主意?

标签: pythonpython-click

解决方案


我终于在点击文档中找到了我需要的东西。

这是我的调试处理解决方案。

@click.group()
@click.option("--debug/--no-debug", default=False, envvar="GIPP_DEBUG")
@click.pass_context
def cli(ctx, debug):
    try:
        subcommand = ctx.invoked_subcommand
        validate_subcommand(subcommand)
    except Exception as e:
        if debug:
            raise
        else:
            sys.exit(f"Error: {e}")

@cli.command()
def sub1():
    # code doing stuff on a git repo

...

推荐阅读