允许子命令之间任意位置使用可选参数

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

我正在使用 argparse 创建一个带有子命令的工具。我有一个标志,例如

-j
,它将输出作为 JSON,并希望用户能够将其传递到命令行上的任何位置:

mytool courses list -j
mytool -j courses list

如果我将参数添加到我的子解析器中,那么我只能使用第一个版本。如果我将它添加到主解析器,那么只有第二个版本有效。

我还尝试使用

parents
参数,但这不起作用:如果您在中间传递
-j
,那么最后一个命令看不到它并将变量设置为 False。

parser = argparse.ArgumentParser()
subparser = parser.add_subparsers(dest='command', required=True)

common_args = argparse.ArgumentParser(add_help=False)
common_args.add_argument('-j', '--json', action='store_true', help='Output as JSON', default=None)

course_parser = subparser.add_parser('course', parents=[common_args])
course_subparser = course_parser.add_subparsers(dest='subcommand', required=True)

course_list_parser = course_subparser.add_parser('list', parents=[common_args])
python argparse
1个回答
0
投票

您可以使

common_args
成为主解析器和子解析器的父级:

common_args = argparse.ArgumentParser(add_help=False)
common_args.add_argument('-j', '--json', action='store_true', help='Output as JSON', default=None)

parser = argparse.ArgumentParser(parents=[common_args])
subparser = parser.add_subparsers(dest='command', required=True)

course_parser = subparser.add_parser('course', parents=[common_args])
course_subparser = course_parser.add_subparsers(dest='subcommand', required=True)
course_list_parser = course_subparser.add_parser('list', parents=[common_args])

演示:https://ideone.com/3izwAN

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