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

16

我正在使用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接受具有一个或多个前导破折号的参数?


由于argparse的解析方法,要做到这一点很难,甚至是不可能的。https://bugs.python.org/issue9334 - hpaulj
可能是 https://dev59.com/b2Qo5IYBdhLWcg3wSNtw 的重复问题。 - hpaulj
这个回答解决了你的问题吗?无法让argparse读取带有破折号的引号字符串? - Mihai Capotă
2个回答

26

通过包含等号,您可以强制argparse将参数解释为值:

python test.py -s=-begins-with-dash -a bar -a baz
Namespace(a=['bar', 'baz'], s='-begins-with-dash')

5
没错,不过我真正想要的是在Python脚本内部解决方案,使其可以像“-s -begins-with-dash”一样被调用。 - jmd_dk
等号也仅限于单个值参数(即不能在nargs参数中执行此操作)。 - ybenjira

2
如果您想将多个值提供给一个参数:
最初的回答:
parser.add_argument('-a', action='append', nargs=argparse.REMAINDER)

将命令行中-a后的所有内容捕获并塞入a中。"Original Answer"翻译成"原始答案"。
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之后。"最初的回答"

只要您有选择哪个参数放在哪里的灵活性。这种方法也不允许您在一个命令行中拥有两个这些类型的参数。 - ybenjira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接