argparse - 错误地忽略有效的参数值[重复]

问题描述 投票:0回答: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
python argparse argv
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.