我将使用Click构建Python CLI,并在处理Click中的异常时遇到了问题。
我不确定这里的措辞(“子命令”,“父命令”),但从我的示例中,您会明白我的意思。让我们假设有以下代码:
期望行为:首先调用
如何处理这样的情况?基本上我只想在
我不确定这里的措辞(“子命令”,“父命令”),但从我的示例中,您会明白我的意思。让我们假设有以下代码:
@click.group()
@click.option("--something")
def mycli(something):
try:
#do something with "something" and set ctx
ctx.obj = {}
ctx.obj["somevar"] = some_result
except:
print("Something went wrong")
raise
#only if everything went fine call mycommand
@click.group()
@click.pass_context
def mygroup(ctx):
pass
@mygroup.command(name="mycommand")
@click.pass_context
def mycommand(ctx):
#this only works if somevar is set in ctx so don't call this if setting went wrong in mycli
应用程序启动时会调用此方法:
if __name__ == "__main__":
mycli.add_command(mygroup)
mycli()
I then start the program like this:
python myapp --something somevalue mycommand
期望行为:首先调用
mycli
,并执行其中的代码。如果抛出异常,则被except块捕获,并打印一条消息并引发异常。由于我们没有其他的try/except块,这将导致脚本终止。"子"命令mycommand
永远不会被调用,因为在运行"父"命令mycli
时程序已经终止。
实际行为:异常被捕获并打印了消息,但是mycommand
仍然被调用。然后它因为未设置所需的上下文变量而失败并报告另一个异常消息。如何处理这样的情况?基本上我只想在
mycli
中的所有内容都正常执行完毕后才调用子命令mycommand
。
exit()
。 - omniexit()
?调用exit()
无法实现什么? - Stephen Rauch