Python argparse:参数中的前导破折号

时间:2018-10-03 22:01:44

标签: python python-3.x parsing command-line-arguments argparse

我正在使用Python的argparse模块来解析命令行参数。考虑下面的简化示例,

# File test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-s', action='store')
parser.add_argument('-a', action='append')
args = parser.parse_args()
print(args)

可以成功调用

python test.py -s foo -a bar -a baz

-s之后和每个-a之后都需要一个参数,如果使用引号,则该参数可以包含空格。但是,如果参数以破折号(-)开头且不包含任何空格,则代码将崩溃:

python test.py -s -begins-with-dash -a bar -a baz
  

错误:参数-s:预期一个参数

我知道它将-begins-with-dash解释为新选项的开始,这是非法的,因为-s尚未收到其必需的参数。同样很清楚,尽管没有定义名称为-begins-with-dash的选项,因此它首先不应将其解释为选项。如何使argparse接受带有一个或多个前划线的参数?

2 个答案:

答案 0 :(得分:3)

您可以通过包含等号来强制argparse将参数解释为值: python test.py -s=-begins-with-dash -a bar -a baz Namespace(a=['bar', 'baz'], s='-begins-with-dash')

答案 1 :(得分:0)

如果您想为一个参数提供多个值:

parser.add_argument('-a', action='append', nargs=argparse.REMAINDER)

将在命令行-a之后抓取一切并将其推入a

python test.py -toe -a bar fi -fo -fum -s fee -foo
usage: test.py [-h] [-s S] [-a ...]
test.py: error: unrecognized arguments: -toe

python test.py -a bar fi -fo -fum -s fee -foo
Namespace(a=[['bar', 'fi', '-fo', '-fum', '-s', 'fee', '-foo']], s=None)

请注意,即使-s是公认的参数,argparse.REMAINDER也会将其添加到-a找到的参数列表中,因为它在命令行上-a之后< / p>