Python Click如何实现hello project template list嵌套命令
实现Click三级嵌套命令的方案
Click 实现多层级命令的核心规则:所有需要挂载子命令的中间层级,必须用@click.group()定义为命令组,只有最末端执行业务逻辑的节点,才用@<上级组名>.command()定义为可执行命令。
你当前代码的问题是直接把project定义成了根命令下的末端command,这类节点无法继续挂载子命令,自然无法实现hello project template list的三级调用结构。
正确的层级拆分
要实现目标命令,需要按命令段拆分4层结构:
- 第一层:根命令组,对应命令前缀
hello - 第二层:
project子命令组,挂载在根命令组下,对应命令第二段project - 第三层:
template子命令组,挂载在project组下,对应命令第三段template - 第四层:
list执行命令,挂载在template组下,对应命令最后一段list,JSON读取和打印的逻辑全部放在这个末端函数中即可。
修正后的完整代码
import click import json # 根命令组:对应 hello @click.group() def cli(): pass # 二级命令组:对应 hello project @cli.group() def project(): pass # 三级命令组:对应 hello project template @project.group() def template(): pass # 末端执行命令:对应 hello project template list @template.command(name='list') def list_templates(): with open('template.json', 'r', encoding='utf-8') as f: data = json.load(f) for item in data['project_template']: click.echo() click.echo(f"Template name: {item['template_name']}") click.echo(f"GitHub location: {item['github_location']}") click.echo(f"Project Description: {item['project_description']}") click.echo() if __name__ == "__main__": cli()
注意事项
- 不要用原生
print()做终端输出,优先使用Click提供的click.echo(),可以自动兼容不同操作系统的终端编码、换行规则,避免出现乱码、输出格式异常的问题。 - 读取JSON文件时建议显式指定
encoding='utf-8',避免Windows系统下默认使用GBK编码打开文件导致解析报错。 - 定义命令时
name参数需要填写实际调用的命令名,你原有代码里写的name='to print something'不符合命令命名规则,会导致实际注册的命令和预期不符。 - 部署完代码可以先执行
hello project template --help查看帮助信息,确认list子命令已经正确挂载后,再执行hello project template list即可触发对应逻辑。
内容的提问来源于stack exchange,提问作者Ayushi Agarwal
相关产品推荐
相关产品推荐

