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 个选项。
将 authenticate
中的逻辑抽象为 python 方法,并在 authenticate
和 if testmode
块中调用它。
研究从一个命令调用另一个命令。单击命令可以访问上下文,这是一种单击以保持引用当前命令和其他命令的状态的方法。可以找到更多信息 here.
为清楚起见,单击上下文 ctx
可以调用另一个命令,如下所示:
ctx.invoke(authenticate, user=user_value, password=password_value)
.
如果调用的当前命令与您要调用的另一个命令具有相同的选项和参数,则单击为其提供 shorthand:
click.forward(authenticate)
,这会将相同的参数传递给 authenticate
命令。
我刚刚开始一个简单的项目并使用 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 个选项。
将
authenticate
中的逻辑抽象为 python 方法,并在authenticate
和if testmode
块中调用它。研究从一个命令调用另一个命令。单击命令可以访问上下文,这是一种单击以保持引用当前命令和其他命令的状态的方法。可以找到更多信息 here.
为清楚起见,单击上下文 ctx
可以调用另一个命令,如下所示:
ctx.invoke(authenticate, user=user_value, password=password_value)
.
如果调用的当前命令与您要调用的另一个命令具有相同的选项和参数,则单击为其提供 shorthand:
click.forward(authenticate)
,这会将相同的参数传递给 authenticate
命令。