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
机制可用于减少输入量,但您也可以轻松编写自己的实用程序函数。
我有代码:
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
机制可用于减少输入量,但您也可以轻松编写自己的实用程序函数。