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

Python argparse-错误忽略的有效参数值,python,argparse,argv,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 1

考虑以下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

在“argparse”文档中,16.4.4.3中提到了这种情况:

parse_args方法尝试在用户有错误时给出错误 显然犯了一个错误,但有些情况本身就是模棱两可的。 例如,命令行参数-1可以是 指定选项或尝试提供位置参数。 parse_args方法在这里很谨慎:位置参数可能会 如果它们看起来像负数,并且没有 解析器中看起来像负数的选项

对于位置参数,可以在“-”之前加上前缀,但在您的情况下,这似乎不起作用。相反,支持使用子parser,因此

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

这个断言是正确的。参数在shell调用中用引号括起来是有原因的。如果执行mcve.py-o'-t 123'-怎么办?sys.argv是['mcve.py','-o','-t 123'],解析成功,但这只是因为值字符串不是以-t开头的,而现在它是以'-t开头的。我看不出引号中的包装值与在此上下文中用空格预包装值有何不同。有关详细信息,请访问。我列出了几个解决办法。或者坚持使用optpass。