我有以下脚本:
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接受这种输入,其中参数,=和值之间有空格?
答案 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
语法。