Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么args.add_参数在两个单独的语句中给出而不是在python中给出时有效?_Python_Command Line Arguments_Argparse - Fatal编程技术网

为什么args.add_参数在两个单独的语句中给出而不是在python中给出时有效?

为什么args.add_参数在两个单独的语句中给出而不是在python中给出时有效?,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,我试图使用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) 然而,这

我试图使用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 '-'
python argparsing.py“你好”
回溯(最近一次呼叫最后一次):
文件“argparsing.py”,第3行,在
parser.add_参数('bar','-foo'))
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py”,第1267行,在add_参数中
kwargs=self.\u获取\u可选\u kwargs(*args,**kwargs)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py”,第1397行,在_get_optional_kwargs中
提升值错误(消息%tup)
ValueError:无效的选项字符串“bar”:必须以字符“-”开头
两者之间的唯一区别是我在第一个代码中分别添加了参数(在两行中),但在失败代码中将它们添加到与一条语句相同的行中。
有人能帮我更好地理解这一点吗?

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

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

parser.add_argument("bar")  # This is a required argument
另一种是使用破折号

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

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

add\u参数
旨在添加单个参数
'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'
解析为一个选项,但它不能,因为它不是以
-
开头的


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

这是否意味着
解析器。添加_参数('-f','-foo-bar','-foo'),只会产生一个
f,foo-bar和foo'等效的标志?@user2708477:是的。但是你可以试着自己看,就像你可以要求的那样容易。如果您
parse_args(['-fspam','-foo=eggs'])
,或者使用
python argparsing.py-fspam-foo=eggs运行程序,您将获得
名称空间(foo_bar='egs')
@user2708477:此外,如果您阅读文档,应该很明显,所有给定的标志都将以相同的
操作结束,
dest
等。否则它将如何工作?另外…你的例子是一个字符对一个字符,与文档中的一个例子相同,在下面,它已经向你展示了发生了什么。对不起,我有点困惑。当我运行这个
python argparsing.py-fspam-f=eggs
时,我得到了
名称空间(foo\u bar='eggs')
。当我在commandline@user2708477:因为
-f
--foo bar
--foo
都是相同的选项。如果您没有为该选项提供
dest
:“
ArgumentParser
通过获取第一个长选项字符串并去掉初始的
--
字符串来生成dest的值。”我为您链接的文档中对此进行了解释。在文档中编写要比在我的注释中编写好得多。在文档中,添加了多个可选参数,例如
parser.add_参数('-f','-foo-bar','-foo')
@user2708477:所有这些都是可选参数的别名。您试图定义一个同时具有位置性和可选性的参数。