我正在尝试使用 argparse 模块来解析命令行中的参数。这是示例代码
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('bar')
parser.add_argument('-foo')
args=parser.parse_args()
print args
运行这个
python argparsing.py "hello"
Namespace(bar='hello', foo=None)
但是,这不起作用
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('bar','--foo')
#parser.add_argument('-foo')
args=parser.parse_args()
print args
运行此按钮会产生错误
python argparsing.py "hello"
Traceback (most recent call last):
File "argparsing.py", line 3, in <module>
parser.add_argument('bar','-foo')
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 1267, in add_argument
kwargs = self._get_optional_kwargs(*args, **kwargs)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 1397, in _get_optional_kwargs
raise ValueError(msg % tup)
ValueError: invalid option string 'bar': must start with a character '-'
两者之间的唯一区别是我在第一个代码中单独添加参数(在两行中),但将它们与失败代码中的一个语句添加在同一行中。有人可以帮助我更好地理解这一点吗?
add_argument
旨在添加一个参数。 'bar'
是一个立场论点; '--foo'
是一个可选参数。您不能提出既是位置参数又是可选的参数,因此会出现错误。
如果要定义参数,但以不同的方式命名选项,请使用dest
:
# accept an option --foo X, and store X into args.bar
parser.add_argument('--foo', dest='bar')
请注意,您可以为单个可选参数定义多个别名,例如
parser.add_argument('-f', '--foo', '--frobnicate')
你不是在做同样的事情。查看文档:
不能指定位置参数名称或标志 - 名称或选项字符串列表,例如
foo
或-f, --foo
.
列表、只能指定单个位置参数或选项(标志)参数列表。因此,当您尝试给它'bar', '--foo'
,它会尝试将'bar'
解析为一个选项,但不能,因为它不是以-
开头的。
而且,正如下一节所解释的,当您为其提供选项列表时,您正在为其提供同一标志的替代名称列表,而不是一堆单独的标志。所以,你不想做你一开始就想做的事情。
你给了argparse
两种完全不同的方法来定义参数。所以它抛出了一个错误,因为它无法理解你的输入
定义参数的一种方法是不使用破折号,就像你第一次使用的那样
parser.add_argument("bar") # This is a required argument
另一种是使用破折号
parser.add_argument("-f", "--foo")
--foo
只是指定与-f
相同参数的另一种方法。它不像没有破折号(bar
)的参数那样是必需的参数,除非您希望它是必需的参数