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

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

最佳答案

详细说明我的评论:

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

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

它尝试处理“--arg1”,然后是“cmd”。如果“cmd”与子解析器名称匹配,则它将解析委托(delegate)给该解析器,将剩余的字符串交给它。如果cmd子解析器可以处理 --arg2 , 它以 unrecognized 的形式返回争论。

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

所以如果你想把--verbose最后,您将其定义为子解析器参数。或者在 parse_known_args 之后做一些进一步的解析.

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

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

关于python - argparse 中子解析器之后的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41055680/

相关文章:

python-2.7 - Python argparse AssertionError 当参数数量超过阈值时

python-3.x - pytest argparse 测试用例不起作用

python - 在Python中创建列表的空列表

python - Pandas-如何获取另一列中每个对应值的行出现次数

python - 版本控制的 s3fs 本地文件缓存

python - 在神经网络中关闭或忽略 pytorch 中的神经元

python-3.x - python argparse 如果选择了参数则需要另一个参数 =True

python - 使用位置参数之一的值作为可选参数之一的默认值

python - 如何使用 Python 关键字作为 argparse 的参数名称?

python - pySpark Kafka Direct Streaming 更新 Zookeeper/Kafka Offset