使用Python单击调用另一个子命令似乎无法验证字段

时间:2019-06-10 18:35:02

标签: python command-line-interface python-click

如果我从另一个命令调用Click子命令,则看起来被调用的命令似乎无法验证传递的字段。我在做错什么吗?

这是一个小例子:

cli_main.py

import click
import cli_add
import cli_sub
import sys

@click.group()
@click.pass_context
def cli(ctx):
    """Main CLI"""

cli.add_command(cli_add.add)
cli.add_command(cli_sub.subtract)


if __name__ == "__main__":
    sys.exit(cli())

cli_sub.py

import click

@click.group()
@click.pass_context
def subtract(ctx):
    """subtract"""


@subtract.command()
@click.option('--number', type=int, required=True)
@click.pass_context
def number(ctx, number):
    click.echo("Subtract {}".format(number))

cli_add.py

import click
import cli_sub


@click.group()
@click.pass_context
def add(ctx):
    """add"""


@add.command()
@click.option('--number', type=int, required=True)
@click.pass_context
def number(ctx, number):
    if number > 0:
        click.echo("Add {}".format(number))
    else:
        ctx.invoke(cli_sub.number)

示例调用:

python cli_main.py add number --number 1
Add 1

python cli_main.py subtract number --number 1
Subtract 1

python cli_main.py subtract number
Usage: cli_main.py subtract number [OPTIONS]
Try "cli_main.py subtract number --help" for help.

Error: Missing option "--number".

这些工作符合预期。但是,如果我调用以下命令,它将以意外的方式失败。

python cli_main.py add number --number -1
Subtract None

它确实调用减法。问题是我没有在调用中传递参数:

ctx.invoke(cli_sub.number)

因此,我希望它会失败并向我提供用法文本,尤其是因为需要number选项。

我没有正确调用此子命令吗?为什么调用不触发参数的检查方式与不使用参数直接调用子命令的方式相同?

1 个答案:

答案 0 :(得分:0)

您对问题的分析是正确的,您确实需要传递参数。您可以像这样传递参数:

ctx.invoke(cli_sub.number, number=number)

关于您的其他问题:

  

为什么调用不触发参数的检查方式与不带参数的直接调用子命令的方式相同?

在解析参数时完成此检查。如果直接调用ctx.invoke(),则可以理解命令的要求。