Python Click嵌套group仅执行最后命令的实现问题求助
解决Click嵌套组仅执行最后一个命令的问题
这个问题的根源其实是你把invoke_without_command=True的位置放错啦!你现在把它写在了组函数的参数列表里,但这个参数是属于@click.group()装饰器的配置项,不是函数的参数。
为什么会出现当前的问题?
你现在的写法中,每个父组(cli、sub_command)的函数不管有没有传入子命令都会被执行,因为invoke_without_command参数根本没生效。而最后一个subsub_command因为是一个组,且你没有传入它的子命令(它本身也没有子命令),Click就默认输出了它的帮助信息,而没有执行它的函数——因为它的invoke_without_command=True同样没生效。
修正后的代码
把invoke_without_command=True移到每个@click.group()的括号里就可以解决问题:
import os import sys import click @click.group(invoke_without_command=True) def cli(): print('I am the root_command') @cli.group(invoke_without_command=True) def sub_command(): print('I am sub_command') @sub_command.group(invoke_without_command=True) def subsub_command(): print('I am the subsub_command') if __name__ == '__main__': cli()
原理说明
当你给@click.group()设置invoke_without_command=True时,意味着:
- 如果这个组后面没有跟着任何子命令,就执行该组的函数
- 如果这个组后面有子命令,就跳过该组的函数,直接处理子命令
这样当你输入cli sub-command subsub-command时,Click会依次检查每个组:
cli后面有sub-command,所以不执行cli的函数sub_command后面有subsub-command,所以不执行sub_command的函数subsub_command后面没有子命令,所以执行它的函数,输出I am the subsub_command
额外测试场景
- 输入
cli:只会执行cli的函数,输出I am the root_command - 输入
cli sub-command:只会执行sub_command的函数,输出I am sub_command
内容的提问来源于stack exchange,提问作者speeders
相关产品推荐
相关产品推荐

