在argparse中的subparsers之后的可选参数

时间:2016-12-09 08:00:23

标签: python 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转移到最后,而不将其添加到每个组吗?

1 个答案:

答案 0 :(得分:2)

详细说明我的评论:

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

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

它试图处理'--arg1',然后'cmd'。如果'cmd'匹配一个subparser名称,它会将解析委托给该解析器,并为其提供剩余的字符串。如果cmd子分析程序可以处理--arg2,则会将其作为unrecognized参数返回。

主解析器不会恢复解析。相反,它只是像往常一样处理unrecognized个参数 - 如果使用parse_args则引发错误,如果使用extras则将其返回parse_known_args列表。

因此,如果要将--verbose放在最后,则将其定义为subparser参数。或者在parse_known_args之后进行一些进一步的解析。

您可以在两个级别定义--verbose,但有时这样的定义会产生冲突(特别是如果默认值不同)。

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