python 点击应用程序失败并显示 "missing argument" 但无法找到问题所在

python click app is failing with indication of "missing argument" but cannot locate the issue

我正在 python 3.6 中使用 Click 创建一个应用程序。我似乎有一个我找不到的错误。我已经在下面发布了我的代码。

问题是当我输入:

python clickapp.py --help

一切都很好。但是当我输入

python clickapp.py simplerequest --help

我收到一个错误,指出我缺少参数 "directory",但没有回溯来指示错误的来源。确切的输出是:

Usage: clickapp.py [OPTIONS] STARTDATE ENDDATE DIRECTORY COMMAND [ARGS]...

Error: Missing argument "directory".

这是我使用的代码。这是文件名 clickapp.py.

的最小示例
import click

@click.group()
@click.argument('startdate')
@click.argument('enddate')
@click.argument('directory', type=click.Path())
@click.pass_context
def cli(ctx,
        startdate,
        enddate,
        directory):

    ctx.obj['directory'] = directory 
    ctx.obj['startdate'] = startdate
    ctx.obj['enddate'] = enddate


@click.command()
@click.argument('arg1', type=str)
@click.argument('arg2', type=click.Path(exists=True))
@click.argument('arg3', type=int)
@click.pass_context
def SimpleRequest(ctx,
                  arg1,
                  arg2,
                  arg3):

    """Simple request processor"""

    ctx.obj['arg1'] = arg1
    ctx.obj['arg2'] = arg2
    ctx.obj['arg3'] = arg3

cli.add_command(SimpleRequest)

if __name__ == '__main__':
    cli(obj={})

谁能看出错误的来源?

我尝试了一些东西:

  1. 我删除了 arg2 中的 type=click.Path(exists=True) 以查看这是否可能导致问题。但这并没有改变任何东西。

  2. 我还尝试删除一些有关将变量插入 ctx 字典的验证逻辑,但这也无济于事。

您的帮助解析问题是 click 试图首先填写 startdate endate directory 参数。

因此您的 simplerequest --help 填写了前两个,然后它抱怨说缺少第三个 (directory)。

通常命令 (simplerequest) 是第一个参数。然后,您可以在之前添加可选参数,因为单击可以很容易地将这些参数与命令区分开来。

或者您可以强制单击以将第一个 arg 视为有效命令并执行帮助,但这是非标准的,需要一些代码。它还会排除命令名称作为开始日期,尽管它们很可能很容易区分。