我有一个 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来执行常见任务并根据路由名称进行调度。
您提到的对 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
这提供了清晰的命令层次结构和相关的帮助消息。