繁体   English   中英

如何使argparse接受“-”作为选项的参数?

[英]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/issue13922http://bugs.python.org/issue14364http://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM