我有一个需要参数的命令行选项。我希望能够提供"--"
作为论据,但我无法弄清楚如何做到这一点。
示例代码:(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。)
答案 0 :(得分:2)
有一个特殊原因,这不起作用:--
表示“跳过此标记,并将其余参数视为位置,即使它们以破折号开头。”
许多程序不会接受--
作为参数,但他们会接受-
。单个破折号甚至是指定“使用标准输入或输出”代替文件名的标准方法。
因此,您可以为程序的用户做的最好的事情可能是不要将它设计为需要--
,因为这不是通常所做的事情,而不是大多数现代命令行解析库的东西。可能能够解析。
您可以使用--
作为位置选项,因此您可以支持:
--foo -- --
如果你让--foo
有action='store_true'
(即它是一个不带参数的选项),加上一个非强制性的位置参数。这可能会奏效,因为第一个--
表示“停止处理破折号作为选项”,第二个是位置参数。
答案 1 :(得分:2)
理想情况下--foo=--
应该有效,但当前解析器会删除所有' - ',在其位置留下一个空字符串,因此foo=[]
结果。几年前我提出了一个补丁,应该已经解决了这个问题,但它已经被argparse
积压了。 http://bugs.python.org/issue13922,http://bugs.python.org/issue14364,http://bugs.python.org/issue9571
Python argparse with -- as the value建议预处理sys.argv
用其他内容替换--
中的一个或多个。
如果您是修补argparse.py
文件(或ArgumentParser
类的子类)的游戏,我可以重新审视我之前的工作并建议修复。诀窍是接受=--
,但仍然使用第一个免费--
作为' rest-are-positionals'标记(并保留以下--
)。不幸的是,需要修补的一种方法嵌套在一个更大的方法中。