【问题标题】:parsing argument in python在python中解析参数
【发布时间】:2016-04-13 20:35:31
【问题描述】:
我有一个问题,我正在努力寻找解决方案。我不确定是否可以使用 argparse。
我希望能够指定一个选项
myprog -a 1
myprog -a 2
现在当我有 a = 1 时,我希望能够指定 b 和 c。但是当a = 2时,我只能指定d。
myprog -a 1 -b 3 -c 0
myprog -a 2 -d 3
还必须始终指定a
【问题讨论】:
标签:
python
parsing
command-line-interface
argparse
【解决方案1】:
您不能将切换值作为单个 parse_args 调用来执行此操作,但您可以执行以下操作之一:
- 使用sub-commands/sub-parsers
- 在完全配置解析器并在完整命令行上运行之前进行部分解析,首先只检查
a,然后根据第一次调用的结果选择额外的解析器参数进行解析。诀窍是在第一次调用时使用parse_known_args,因此它会处理a(它可以识别)并忽略其他所有内容。
例如,对于方法 #2,您可以这样做:
parser = argparse.ArgumentParser()
parser.add_argument('-a', required=True, type=int, choices=(1, 2)
args = parser.parse_known_args()
if args.a == 1:
parser.add_argument('-b', ...)
parser.add_argument('-c', ...)
args = parser.parse_args()
else:
parser.add_argument('-d', ...)
args = parser.parse_args()
这种方法的缺点是,由于错误使用而吐出的使用信息将不完整;您必须手动在基本解析器中包含指定“真实”用法的文本,这并不好玩。子解析器不能基于值开关进行切换,但它们具有统一、连贯的用法显示。
【解决方案2】:
最简单的解决方案是将'-a' 设为required=True 参数,并将其他参数保留为默认不需要。然后在解析后对 args.a 和其他值执行测试(我假设你可以编写那种 Python 逻辑)。
您可以提出自己的错误,也可以使用parser.error("I don't like your input") 调用。
许多人需要编写自定义usage 行。考虑到这些要求,什么是有意义的用法?
有一个mutually exclusive argument group 方法,但它不使用特定的值,只是参数的存在与否。
您还可以将测试合并到自定义 Action 类中。但通常这比在解析后执行测试更复杂(因为 argparse 处理以任何顺序出现的参数)。
将-a 参数转换为子解析器的另一种可能性。这允许您为一个“解析器”值定义一组参数,为另一个值定义另一组参数。我认为 argparse 文档对此已经足够清楚了。