这个问题在这里已有答案:
考虑关注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()方法在这里是谨慎的:位置参数可能只是以 - 如果它们看起来像负数而且解析器中没有看起来像负数的选项
对于位置参数,您可以添加一个' - ',但在您的情况下似乎不起作用。相反,支持使用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