Python 3.7 ArgumentParser.add_子parser要求在选项之前有位置
我正在尝试创建一个python脚本,它将根据第一个位置参数执行另一个脚本。按照git add的Python 3.7 ArgumentParser.add_子parser要求在选项之前有位置,python,python-3.x,argparse,Python,Python 3.x,Argparse,我正在尝试创建一个python脚本,它将根据第一个位置参数执行另一个脚本。按照git add的git add行为方式思考 问题是ArgumentParser似乎希望列出位置子命令。。。最后。这是非常违反直觉的。(当您想要列出所有文件时,您需要的是ls-a[FILE positional],而不是-a ls[FILE positional],那么为什么它需要scriptname[optionals]子命令而不是scriptname子命令[optionals],因为'subcommand'是'rea
git add
行为方式思考
问题是ArgumentParser似乎希望列出位置子命令。。。最后。这是非常违反直觉的。(当您想要列出所有文件时,您需要的是ls-a[FILE positional]
,而不是-a ls[FILE positional]
,那么为什么它需要scriptname[optionals]子命令而不是scriptname子命令[optionals]
,因为'subcommand'是'real'命令?)
玩具示例:
def get_arg_parser():
parser = argparse.ArgumentParser()
# set up subprocessors
subparser = parser.add_subparsers(required=True)
parser.add_argument('--verbose', action='store_const', const=True, default=False, help="Enable verbose output.")
subcommand1_subparser = subparser.add_parser('subcommand1')
subcommand1_subparser.add_argument('--foo1', type=float)
subcommand2_subparser = subparser.add_parser('subcommand2')
subcommand2_subparser.add_argument('--foo2', type=float)
return parser
if __name__ == "__main__":
if len(sys.argv) > 1:
get_arg_parser().parse_args()
# more
else:
get_arg_parser().print_help()
问题是,如果我尝试运行python-toyexample.py子命令1--verbose
,它会抱怨错误:无法识别的参数:--verbose
。与此同时,python-toyexample.py--verbose子命令1
也可以工作,但它要求在实际要运行的命令名称之前加上选项
我如何覆盖它?多亏了@hpaulj,我找到了一个解决方案:只需将共享参数添加到两个子parser
我将parser.add_参数('--verbose',action='store_const',const=True,default=False,help=“Enable verbose output.”)放在add_shared_args_to_parser
to function的行中,然后调用两次,传递子parser
最终的结果是子解析器有一些不幸的(但并不可怕的)重复,而主解析器只有子解析器。您将“--verbose”定义为解析器的参数。一旦解析器
遇到'subcommand1',解析将传递给subcommand1\u subparser
。就是那个下属抱怨未被认可的论点。子解析器完成后,主解析器不会继续解析。谢谢!这帮我找到了解决办法@布拉姆万罗伊:这完全是重点。请仔细阅读我写的内容:我说过这不是使用LS的方式,所以它当然是不正确的。