Error: No such option yet I've clearly set the option up

Error: No such option yet I've clearly set the option up

我刚刚开始一个简单的项目并使用 Click 库,但在早期遇到了一个我无法弄清楚的障碍。当我 运行 这个带有“--testmode”标志时,它显示为 True 但是后续函数不执行并且我得到一个错误,没有定义这样的选项?我在这里做错了什么?

import click

@click.command()
@click.option('--user', prompt=True)
@click.option('--password', prompt=True, hide_input=True, confirmation_prompt=False)
def authenticate(user, password):
    pass

@click.command()
@click.option('--age')
@click.option('--testmode', is_flag=True)
def main(age, testmode):
    print('Age: ', age)
    print('Testmode: ', testmode)

    if testmode:
        authenticate()

if __name__ == "__main__":
    main()

控制台输出:

python .\dev.py --help
Usage: dev.py [OPTIONS]

Options:
  --age TEXT
  --testmode
  --help      Show this message and exit.


python .\dev.py --testmode
Age:  None
Testmode:  True
Usage: dev.py [OPTIONS]
Try 'dev.py --help' for help.

Error: no such option: --testmode

问题出在这里:

    if testmode:
        authenticate()

您像函数一样调用 authenticate(),但您将其定义为另一个 click.command。这意味着它将查看 sys.argv 的命令行选项,找到 --testmode,并将其与您使用 @click.option.

定义的选项进行比较

authenticate 方法没有 --testmode 选项,因此出现您看到的错误。

有多种方法可以解决此问题。 authenticate 真的需要配置为命令吗?您现在设置代码的方式无法通过命令行调用它。

Iarsks 的答案正是您要查找的内容,但为了进一步详细说明,Click 文档提供了一些有关调用其他命令的信息。因此,如果您真的希望将 authenticate 设置为命令,您有 2 个选项。

  1. authenticate 中的逻辑抽象为 python 方法,并在 authenticateif testmode 块中调用它。

  2. 研究从一个命令调用另一个命令。单击命令可以访问上下文,这是一种单击以保持引用当前命令和其他命令的状态的方法。可以找到更多信息 here.

为清楚起见,单击上下文 ctx 可以调用另一个命令,如下所示: ctx.invoke(authenticate, user=user_value, password=password_value).

如果调用的当前命令与您要调用的另一个命令具有相同的选项和参数,则单击为其提供 shorthand: click.forward(authenticate),这会将相同的参数传递给 authenticate 命令。