如何设置argparse.ArgumentParser()以获取需要[可选]位置参数(foo)的可选参数(-p bar)?
该计划应接受:
但它不应该接受:
这是我的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
def setupArgParser():
desc="tun0graf"
parser=argparse.ArgumentParser(description=desc)
parser.add_argument('logfilename', nargs='?', help='name of a logfile')
parser.add_argument('-s', dest='snapname', nargs=1,
help='create snapshot of logfilename and save it as snapname.png')
return(parser.parse_args())
arg=setupArgParser()
print "logfilename", arg.logfilename
print "snapname", arg.snapname
答案 0 :(得分:1)
对你的功能的这种修改应该可以解决这个问题:
def setupArgParser():
desc="tun0graf"
usage = '%(prog)s [-h] [logfilename [-s SNAPNAME]]'
parser=argparse.ArgumentParser(description=desc, usage=usage)
parser.add_argument('logfilename', nargs='?', help='name of a logfile')
parser.add_argument('-s', dest='snapname', nargs=1,
help='create snapshot of logfilename and save it as snapname.png')
args = parser.parse_args()
# test
if args.logfilename is None and args.snapname is not None:
parser.error('SNAPNAME can only be used with logfilename')
return args
我正在测试解析后2个参数的交互。我正在使用自定义usage
。有了这个,给出一个没有文件名的-s name
会产生:
usage: stack24219021.py [-h] [logfilename [-s SNAPNAME]]
stack24219021.py: error: SNAPNAME can only be used with logfilename
没有自定义用法,我们得到:
usage: stack24219021.py [-h] [-s SNAPNAME] [logfilename]
那是因为parser
对2个参数的交互一无所知,它通常会在positional
之后放置optionals
个参数(-
})。
除了您希望logfilename
是可选的外,这看起来像是子分析符的情况。正如最近在Py2.7中https://stackoverflow.com/a/24211480/901925所讨论的那样,这是不可能的。在最新的Py3版本中,subparsers是可选的,但这是一个将被更改的错误(尽管可能仍然可以将它们标记为可选)。
有人谈论扩展Mutually_exclusive_group
机制以允许像你这样的更一般的测试。您的示例将是一个很好的测试用例。但是我上面写的测试比使用提议的groups
做的任何事情都简单。