argparse 中子解析器之后的可选参数

Optional argument after subparsers in argparse

我有代码:

parser = ArgumentParser()
parser.add_argument('--verbose', action='count', default=0, help='debug output')
subparsers = parser.add_subparsers(help='subparser')
parser1 = subparsers.add_parser('action', help='Do something')
parser1.add_argument('--start', action='store_true', help='start')
parser1.add_argument('--stop', action='store_true', help='stop')
parser2 = subparsers.add_parser('control', help='Control something')
parser2.add_argument('--input', action='store_true', help='start')
parser2.add_argument('--output', action='store_true', help='stop')
args = parser.parse_args()

然后我可以运行脚本:

script.py --verbose action --start

script.py --verbose control --output

但不是

script.py action --start --verbose

script.py control --output --verbose

我可以将选项 --verbose 转移到最后,而不将其添加到每个组吗?

详细说明我的评论:

argparse 按顺序解析输入列表 (sys.argv[1:]),将字符串与 Actions (add_argument 对象) 匹配。所以如果命令是

 python foo.py --arg1=3 cmd --arg2=4

它尝试处理“--arg1”,然后 'cmd'。如果 'cmd' 匹配一个子解析器名称,它将解析委托给该解析器,将剩余的字符串交给它。如果 cmd 子解析器可以处理 --arg2,它 returns 作为 unrecognized 参数。

主解析器没有恢复解析。相反,它只是像往常一样处理 unrecognized 参数——如果使用 parse_args 则引发错误,如果使用 parse_known_args.[=24= 则将它们返回到 extras 列表中]

所以如果你想把 --verbose 放在最后,你已经将它定义为一个子解析器参数。或者在 parse_known_args.

之后做一些进一步的解析

您可以在两个级别上定义 --verbose,但有时这样的定义会产生冲突(尤其是在默认值不同的情况下)。

parents 机制可用于减少输入量,但您也可以轻松编写自己的实用程序函数。