带空格的Argparse

时间:2015-09-04 10:14:14

标签: python argparse

我有以下脚本:

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接受这种输入,其中参数,=和值之间有空格?

4 个答案:

答案 0 :(得分:0)

关于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']

答案 1 :(得分:0)

shell在程序运行之前处理您的参数列表,并且处理非常简单:将命令名后面的每个空格分隔的单词视为单独的参数。根据该逻辑,--foo = bar是3个单独的参数,因此sys.argv包含["--foo", "=", "bar"]。没有避免这种情况,因为它发生在argparse之前。

鉴于这一事实,编写--foo = bar没有任何好处,因为它等同于--foo=bar--foo bar,只有无关的字符(第一种情况下的空格,{{1}在第二个)。

至于为什么=在等同于--foo=bar时完全支持,我不知道。它可能只是为了与现有做法兼容;它可能对不同的参数解析器很有用,但--foo bar似乎不需要它。在过去的某个时刻,我认为我想出了一个原因,为什么能够使用一个shell单词而不是两个shell单词指定argparse的参数是有用的,但我似乎忘记了它。

答案 2 :(得分:0)

首先,代码出现问题:程序会将以空格分隔的组件视为单独的参数。你的例子应该已经阅读

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'])

将equals-sign解析为参数,因为长参数语法为--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'), [])

答案 3 :(得分:0)

使用时

parser.parse_known_args(['--arg1 = value'])

它等同于命令行:

$myfun.py '--arg1 = value'

在这两种情况下,--arg1 = value都被视为一个字符串。由于它与'--arg1''--arg1='不匹配,因此会进入无法识别的字符串列表。

正如其他人所指出的,没有引号$myfun.py --arg1 = value['--arg1', '=', 'value']传递给解析器。哪个会解析为:

(Namespace(arg1='='), ['value'])

如果使用--arg定义了nargs='+',那么您将获得

(Namespace(arg1=['=', 'value']), [])

你可以忽略' ='。

但为了与其他命令行实践保持一致,我建议坚持使用--arg1=value--arg1 value语法。