考虑关注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
答案 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