我有以下脚本:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--arg1', dest='arg1')
parse_results = parser.parse_known_args(['--arg1 = value'])然而,我得到的结果是:
(Namespace(arg1=None), ['--arg1 = value'])有没有办法使用argparse来接受这种在参数=和值之间有空格的输入?
发布于 2015-09-04 19:24:20
shell在您的程序运行之前处理您的参数列表,该处理非常简单:将命令名后面的每个空格分隔的单词视为单独的参数。按照这个逻辑,--foo = bar是3个独立的参数,所以sys.argv包含["--foo", "=", "bar"]。这是无法避免的,因为它发生在argparse运行之前。
鉴于这一事实,编写--foo = bar没有任何好处,因为它等同于--foo=bar或--foo bar,只是带有无关的字符(第一种情况下是空格,第二种情况下是= )。
至于为什么当--foo=bar等同于--foo bar时,它会被支持,我不知道。它可能只是为了与现有实践兼容;它可能对不同的参数解析器有用,但argparse似乎不需要它。在过去的某个时候,我认为我已经想出了一个原因,为什么能够使用一个shell字而不是两个shell字来指定--foo的参数是有用的,但我似乎忘记了这一点。
发布于 2015-09-04 18:28:27
它是关于shell如何解析参数的:
bruno@bigb:~/Work/playground$ cat argz.py
import sys
print "args:", sys.argv
bruno@bigb:~/Work/playground$ python argz.py --foo = bar --bar=baaz
args: ['argz.py', '--foo', '=', 'bar', '--bar=baaz']发布于 2015-09-04 19:26:14
首先,您的代码存在一个问题:程序会将以空格分隔的组件视为单独的参数。你的例子应该是
parse_results = parser.parse_known_args(['--arg1', '=', 'value'])或者,您可以使用split()动态生成数组,正如文档所做的那样:
parse_results = parser.parse_known_args('--arg1 = value'.split())上面的仍然不能给你想要的:
>>> parser.parse_known_args('--arg1 = value'.split())
(Namespace(arg1='='), ['value'])等号被解析为参数,因为长参数语法为--option=value或--option value。=符号仅用于将选项名称与其参数分隔;如果参数由空格分隔,则没有必要包含它,因此不支持语法--option = value。
建议:仅使用标准的长参数语法,即--arg1 value或--arg=value。
但是,如果您绝对必须支持表单--arg1 = value,则可以过滤参数列表以丢弃单个=符号的元素。
>>> cleanup = lambda args: (a for a in args if a != '=')
>>> parser.parse_known_args(cleanup('--arg1 = value'.split()))
(Namespace(arg1='value'), [])https://stackoverflow.com/questions/32395529
复制相似问题