带有附加参数和帮助消息的python subargparser

问题描述 投票:0回答:1

我有一个 cli 程序,我需要根据子命令的名称传递附加参数。到目前为止我已经得到了这个,但是它没有针对传入的不同名称的帮助消息。

def route_handler(args, remain):
   perform_common_tasks()
   if args.name == 'A':
      route_a_handler(remain)
   elif args.name == 'B':
      route_b_handler(remain)


main_parser = argparse.ArgumentParser()
subparsers = main_parser.add_subparsers(title='sub-commands', required=True)

subparser_a = subparsers.add_parser('route')
subparser_a.add_argument('--name', '-n')

subparser_a.set_defaults(func=route_handler)
args, remain = main_parser.parse_known_args()
args.func(args, remain)

usage: open.py route [-h] [--name {A,B}]

optional arguments:
  -h, --help            show this help message and exit
  --name {A,B}, -n {A,B}
abc@MacBook-Air python % python3 open.py route A -h
usage: open.py route [-h] [--name {A,B}]

optional arguments:
  -h, --help            show this help message and exit
  --name {A,B}, -n {A,B}

如何添加路线A或B的帮助消息?

我尝试为 subparser_a 添加子解析器,它确实给了我一个很好的帮助消息。但我不再能够调用route_handler来执行常见任务并根据路由名称进行调度。

python argparse
1个回答
0
投票

您提到的对 subparser_a 使用子解析器的方法是处理这种情况的正确方法,因为它允许分层命令结构。要为每条路线添加帮助消息并且仍然能够执行常见任务,您可以稍微调整您的方法。

以下是构建它的方法:

使用子解析器进行路由。 在路由子解析器下为 A 和 B 添加第二层子解析器。 有一个执行常见任务的单一入口函数,然后根据选定的子命令委派任务。 这是一个例子:

import argparse

def route_a_handler(args):
    print("Handling Route A with args:", args)

def route_b_handler(args):
    print("Handling Route B with args:", args)

def route_handler(args):
    perform_common_tasks()

    if args.route_name == 'A':
        route_a_handler(args)
    elif args.route_name == 'B':
        route_b_handler(args)

def perform_common_tasks():
    print("Performing common tasks...")

main_parser = argparse.ArgumentParser()
subparsers = main_parser.add_subparsers(title='sub-commands', required=True, dest='sub_command')

route_parser = subparsers.add_parser('route', help='Route command')

# Add a second layer of subparsers for A and B
route_subparsers = route_parser.add_subparsers(title='route-name', required=True, dest='route_name')

route_a_parser = route_subparsers.add_parser('A', help='Help for route A')
route_b_parser = route_subparsers.add_parser('B', help='Help for route B')

route_parser.set_defaults(func=route_handler)

args = main_parser.parse_args()
args.func(args)

通过这种方法,当您使用不同的命令运行 CLI 时,您将看到:

$ python3 open.py route -h
usage: open.py route [-h] {A,B} ...

Route command

positional arguments:
  {A,B}
    A        Help for route A
    B        Help for route B

optional arguments:
  -h, --help  show this help message and exit

并且:

$ python3 open.py route A -h
usage: open.py route A [-h]

Help for route A

optional arguments:
  -h, --help  show this help message and exit

这提供了清晰的命令层次结构和相关的帮助消息。

© www.soinside.com 2019 - 2024. All rights reserved.