[英]How can I get argparse to accept “--” as an argument to an option?
我有一个需要参数的命令行选项。 我希望能够提供"--"
作为参数,但是我不知道该怎么做。
示例代码:( 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。)
理想情况下--foo=--
应该可以工作,但是当前的解析器会删除所有的'-',并在其位置保留一个空字符串,因此foo=[]
结果。 我提出了一个补丁几年前应该有固定的,但它夹在argparse
积压。 http://bugs.python.org/issue13922 , http://bugs.python.org/issue14364 , http://bugs.python.org/issue9571
Python的argparse用-作为值表明预处理sys.argv
替换一个或多个的--
别的东西。
如果您是用来修补argparse.py
文件(或ArgumentParser
类的子类)的游戏,那么我可以回顾一下我先前的工作并提出修复建议。 诀窍是接受=--
但仍将第一个自由--
用作'rest-are-positionals'标志(并保留后面的所有--
)。 不幸的是,一种需要修补的方法嵌套在一个更大的方法中。
有一个特定的原因导致此操作不起作用: --
表示“跳过此标记,并认为其余参数以位置开头,即使它们以短划线开头也是如此。”
许多程序不接受--
作为参数,但它们将接受-
。 连字符甚至是指定“使用标准输入或输出”代替文件名的标准方式。
因此,您可以为程序的用户做的最好的事情就是不要将其设计为要求--
,因为这不是通常要做的事情,也不是大多数现代命令行解析库都可以解析的事情。
您可以使用--
作为位置选项,因此您可能支持以下内容:
--foo -- --
如果使--foo
具有action='store_true'
(即,它是不带参数的选项),再加上一个非强制性位置参数。 这可能会起作用,因为第一个--
表示“停止将破折号作为选项处理”,第二个表示位置参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.