我怎么得到:prog.py [-h] [foo [-p bar]]

时间:2014-06-14 10:34:18

标签: python argparse

如何设置argparse.ArgumentParser()以获取需要[可选]位置参数(foo)的可选参数(-p bar)?

该计划应接受:

  • prog.py
  • prog.py foo
  • prog.py foo -p bar

但它不应该接受:

  • prog.py -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

1 个答案:

答案 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做的任何事情都简单。