我正在使用 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])
您可以使
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])