我正在使用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
error:参数-s:期望一个参数
我认为它将-begins-with-dash
解释为新选项的开头,这是非法的,因为-s
尚未收到其必要的论点。虽然没有定义名称为-begins-with-dash
的选项,但也很清楚,所以它不应该首先将它解释为一个选项。如何让argparse
接受一个或多个前导破折号的参数?
您可以通过包含等号来强制argparse将参数解释为值:
python test.py -s=-begins-with-dash -a bar -a baz
Namespace(a=['bar', 'baz'], s='-begins-with-dash')
如果您试图为一个参数提供多个值:
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
找到的args列表中,因为它位于命令行上的-a
之后