我怎样才能让argparse接受" - "作为选项的论据?

时间:2016-12-17 01:44:48

标签: python argparse

我有一个需要参数的命令行选项。我希望能够提供"--"作为论据,但我无法弄清楚如何做到这一点。

示例代码:(test-argparse.py

#!/usr/bin/env python

from __future__ import print_function
import argparse
import sys


def main(argv):
    ap = argparse.ArgumentParser()
    ap.add_argument("-x", "--foo", metavar="VALUE", default="",
                    help="Test option.")
    args = ap.parse_args(argv[1:])

    print(args.foo)

if __name__ == "__main__":
    sys.exit(main(sys.argv))

我尝试将"--"作为参数传递的所有尝试都失败了:

$ test-argparse.py --foo --
usage: test-argparse.py [-h] [-x VALUE]
test-argparse.py: error: argument -x/--foo: expected one argument

$ test-argparse.py --foo -- --
usage: test-argparse.py [-h] [-x VALUE]
test-argparse.py: error: argument -x/--foo: expected one argument

$ test-argparse.py --foo=--
[]

$ test-argparse.py --foo=-- --
usage: test-argparse.py [-h] [-x VALUE]
test-argparse.py: error: unrecognized arguments: --

$ test-argparse.py --foo="--"
[]

$ test-argparse.py '--foo --'
usage: test-argparse.py [-h] [-x VALUE]
test-argparse.py: error: unrecognized arguments: --foo --

$ test-argparse.py -x--
[]

$ test-argparse.py '-x --'
 --

最后一种情况是最接近的,但它包含空格(我不能只删除空格,因为如果我想允许" "作为值,会怎样?)。有什么方法可以实现这个目标吗?

argparse强制对客户进行论证排列(导致不必要的歧义)是非常令人沮丧的。

(我使用的是Python 2.7.12。)

2 个答案:

答案 0 :(得分:2)

有一个特殊原因,这不起作用:--表示“跳过此标记,并将其余参数视为位置,即使它们以破折号开头。”

许多程序不会接受--作为参数,但他们会接受-。单个破折号甚至是指定“使用标准输入或输出”代替文件名的标准方法。

因此,您可以为程序的用户做的最好的事情可能是不要将它设计为需要--,因为这不是通常所做的事情,而不是大多数现代命令行解析库的东西。可能能够解析。

您可以使用--作为位置选项,因此您可以支持:

--foo -- --

如果你让--fooaction='store_true'(即它是一个不带参数的选项),加上一个非强制性的位置参数。这可能会奏效,因为第一个--表示“停止处理破折号作为选项”,第二个是位置参数。

答案 1 :(得分:2)

理想情况下--foo=--应该有效,但当前解析器会删除所有' - ',在其位置留下一个空字符串,因此foo=[]结果。几年前我提出了一个补丁,应该已经解决了这个问题,但它已经被argparse积压了。 http://bugs.python.org/issue13922http://bugs.python.org/issue14364http://bugs.python.org/issue9571

Python argparse with -- as the value建议预处理sys.argv用其他内容替换--中的一个或多个。

如果您是修补argparse.py文件(或ArgumentParser类的子类)的游戏,我可以重新审视我之前的工作并建议修复。诀窍是接受=--,但仍然使用第一个免费--作为' rest-are-positionals'标记(并保留以下--)。不幸的是,需要修补的一种方法嵌套在一个更大的方法中。