argparse - 错误地忽略有效的参数值

时间:2018-01-04 07:53:04

标签: python argparse argv

考虑关注MCVE:

import sys
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-t", "--test")
parser.add_argument("-o", "--other")
assert sys.argv == ['mcve.py', '-o', '-t 123']
parsed = parser.parse_args()
assert parsed.other == "-t 123"

及其'调用:

lrogalsk-mac01:src lrogalsk$ python mcve.py -o "-t 123"
usage: mcve.py [-h] [-t TEST] [-o OTHER]
mcve.py: error: argument -o/--other: expected one argument

如您所见,shell中的值被正确解释并作为单独的命令行参数传递给Python进程。尽管如此,argparse解析机制仍然拒绝此值(可能因为它以另一个参数-t的匹配开始)。

将调用更改为空格前置值(见下文)并调整MCVE脚本中的断言使其工作,但这对我来说仅仅是解决方法而不是实际的解决方案。

lrogalsk-mac01:src lrogalsk$ python mcve.py -o " -t 123"

在argparse中有没有任何已知的修复此行为的方法?

设置详情:

lrogalsk-mac01:src lrogalsk$ python --version
Python 2.7.10

1 个答案:

答案 0 :(得分:1)

在'argparse'文档中,提到了这种情况(16.4.4.3):

  

parse_args()方法尝试在用户拥有时提供错误   显然是犯了一个错误,但有些情况本质上是模棱两可的。   例如,命令行参数-1可以是尝试   指定选项或尝试提供位置参数。   parse_args()方法在这里很谨慎:位置参数可能   只开始 - 如果他们看起来像负数而没有   解析器中看起来像负数的选项

对于位置参数,你可以添加一个' - ',但在你的情况下似乎不起作用。相反,支持使用subparsers,所以

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help = 'the subparsers')
parser_a = subparsers.add_parser('o', help = 'the o option')
parser_a.add_argument('-t', '--test')
parsed = parser.parse_args()
print(parsed.test)

的工作原理。用

调用脚本
python mcve.py o -t 123

给出输出

123