如何获取:prog.py [-h] [foo [-p bar]]

2024-10-04 07:31:06 发布

您现在位置:Python中文网/ 问答频道 /正文

如何设置argparse.ArgumentParser参数分析器()获取需要[optional]位置参数(foo)的可选参数(-p bar)?你知道吗

程序应接受:

  • 你知道吗程序副本你知道吗
  • 你知道吗程序副本福
  • 你知道吗程序副本foo-p酒吧

但不应接受:

  • 你知道吗程序副本-压力棒

这是我的密码:

#!/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

Tags: 程序addparser参数foo副本argargparse
1条回答
网友
1楼 · 发布于 2024-10-04 07:31:06

对函数的这种修改应该起到以下作用:

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

我正在测试解析后这两个参数的交互作用。我正在使用一个自定义的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对这两个参数之间的相互作用一无所知,它通常把positional参数放在optionals之后(那些带有-的参数)。你知道吗


这看起来确实像子parser的情况,只是您希望logfilename是可选的。正如最近在Py2.7的https://stackoverflow.com/a/24211480/901925中所讨论的,这是不可能的。在最新的Py3版本中,subparser是可选的,但这是一个将被更改的bug(尽管仍然可以将它们标记为可选的)。你知道吗

有人说要扩展Mutually_exclusive_group机制以允许像您这样的更一般的测试。你的例子将是一个很好的测试用例。但是我在上面写的测试比用建议的groups所能做的任何事情都要简单。你知道吗

相关问题 更多 >