首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带空格的Argparse

带空格的Argparse
EN

Stack Overflow用户
提问于 2015-09-04 18:14:14
回答 4查看 2.9K关注 0票数 1

我有以下脚本:

代码语言:javascript
复制
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--arg1',  dest='arg1')
parse_results = parser.parse_known_args(['--arg1 = value'])

然而,我得到的结果是:

代码语言:javascript
复制
(Namespace(arg1=None), ['--arg1 = value'])

有没有办法使用argparse来接受这种在参数=和值之间有空格的输入?

EN

回答 4

Stack Overflow用户

发布于 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的参数是有用的,但我似乎忘记了这一点。

票数 1
EN

Stack Overflow用户

发布于 2015-09-04 18:28:27

它是关于shell如何解析参数的:

代码语言:javascript
复制
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']
票数 0
EN

Stack Overflow用户

发布于 2015-09-04 19:26:14

首先,您的代码存在一个问题:程序会将以空格分隔的组件视为单独的参数。你的例子应该是

代码语言:javascript
复制
parse_results = parser.parse_known_args(['--arg1', '=', 'value'])

或者,您可以使用split()动态生成数组,正如文档所做的那样:

代码语言:javascript
复制
parse_results = parser.parse_known_args('--arg1 = value'.split())

上面的仍然不能给你想要的:

代码语言:javascript
复制
>>> parser.parse_known_args('--arg1 = value'.split())
(Namespace(arg1='='), ['value'])

等号被解析为参数,因为长参数语法为--option=value--option value=符号仅用于将选项名称与其参数分隔;如果参数由空格分隔,则没有必要包含它,因此不支持语法--option = value

建议:仅使用标准的长参数语法,即--arg1 value--arg=value

但是,如果您绝对必须支持表单--arg1 = value,则可以过滤参数列表以丢弃单个=符号的元素。

代码语言:javascript
复制
>>> cleanup = lambda args: (a for a in args if a != '=')
>>> parser.parse_known_args(cleanup('--arg1 = value'.split()))
(Namespace(arg1='value'), [])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32395529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档