4

我正在尝试使用 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 '-'

两者之间的唯一区别是我在第一个代码中分别添加参数(在两行中),但将它们添加到与失败代码中的一个语句相同的行中。有人可以帮助我更好地理解这一点吗?

4

3 回答 3

3

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')
于 2013-10-01T21:42:41.720 回答
2

你不是在做同样的事情。查看文档

名称或标志 - 名称或选项字符串列表,例如foo-f, --foo

您不能指定位置参数列表、单个位置参数或选项(标志)参数列表。因此,当您尝试给它时'bar', '--foo',它会尝试将其解析'bar'为一个选项,但它不能,因为它不是以-.

而且,正如下一节所解释的,当你给它一个选项列表时,你给它一个相同标志的替代名称列表,而不是一堆单独的标志。所以,你不想做你想做的事情。

于 2013-10-01T21:43:00.887 回答
0

所以你给出了argparse两种完全不同的方式来定义一个论点。所以它抛出一个错误,因为它无法理解你的输入

定义参数的一种方法是不使用你第一次使用的破折号

parser.add_argument("bar")  # This is a required argument

另一种是使用破折号

parser.add_argument("-f", "--foo")  

--foo只是指定与 相同的参数的另一种方式-f。它不是像没有破折号 ( bar) 那样的必需参数,除非您希望它是必需参数

于 2013-10-01T21:42:05.560 回答