Python argparse如何实现无需输入-h的分层级帮助信息打印
问题原因
你没有保存service层级的ArgumentParser实例,调用print_help()的对象是子解析器集合_SubParsersAction,不是服务本身的解析器,因此打印帮助的逻辑不生效。
修正方案
拆分链式调用,单独保存每个层级的解析器实例,对应层级打印帮助时调用对应解析器的方法即可,完整可运行代码如下:
import argparse # 根解析器 argument_parser = argparse.ArgumentParser(description="my_cli") root_subparsers = argument_parser.add_subparsers(title="service", dest="service", required=False) # ========== service1配置 ========== # 单独保存service1解析器实例,不要直接链式调用丢失实例 service1_parser = root_subparsers.add_parser("service1", help="service1相关操作") service1_subparsers = service1_parser.add_subparsers(title="action", dest="action", required=False) # 配置service1下的action1 service1_action1_parser = service1_subparsers.add_parser("action1", help="执行service1的action1操作") service1_action1_parser.add_argument("-a", "--address", required=True, help="服务器地址或主机名") # ========== service2配置 ========== service2_parser = root_subparsers.add_parser("service2", help="service2相关操作") service2_subparsers = service2_parser.add_subparsers(title="action", dest="action", required=False) # 后续service2的action按同样规则添加即可 # 解析参数 args = argument_parser.parse_args() # 分层打印帮助逻辑 if args.service is None: # 无服务参数,打印根帮助 argument_parser.print_help() exit(1) elif args.action is None: # 有服务无动作参数,打印对应服务的帮助 if args.service == "service1": service1_parser.print_help() elif args.service == "service2": service2_parser.print_help() exit(1) else: # 有服务有动作参数,打印对应动作的帮助 if args.service == "service1" and args.action == "action1": service1_action1_parser.print_help() # 其他动作判断按同样规则补充即可 exit(1)
效果验证
- 执行
my_cli:展示所有服务的帮助信息 - 执行
my_cli service1:仅展示service1的所有操作帮助 - 执行
my_cli service1 action1:仅展示action1的参数说明
内容的提问来源于stack exchange,提问作者user3108468
相关产品推荐
相关产品推荐

