[英]How to code argparse combinational options in python
我很困扰这项小活动要完成。 我做了一些实验,但未能达到效果。
需求:
test2.py [-c/-v] -f
用法或规则:
-c(比较)需要2个参数。
-v(验证)需要1个参数。
这两者中的任何一个都必须存在, 但不能同时存在 。
输出:
我能够得到所需的输出,如下所示
kp@kp:~/Study/scripts$ ./test.py -c P1 P2 -f p
kp@kp:~/Study/scripts$ ./test.py -v P1 -f p
kp@kp:~/Study/scripts$ ./test.py -v P1
usage: test.py <functional argument> <ouput target argument>
test.py: error: argument -f/--file is required
kp@kp:~/Study/scripts$ ./test.py -c P1 P2
usage: test.py <functional argument> <ouput target argument>
test.py: error: argument -f/--file is required
kp@kp:~/Study/scripts$
问题是:
当你使用test.py -h
,
1. 输出不会指示-c / -v中的任何一个是强制性的,而不是两者都是强制性的 。 它表示所有参数都是可选的。
2.输出将在可选参数下指示-f选项,这是不正确的。 -f是必需参数,我想显示外部 - 可选参数。
如何更改脚本以便-h选项输出更加用户友好(无需任何外部验证)
usage: test.py <functional argument> <ouput target argument>
Package Compare/Verifier tool.
optional arguments:
-h, --help show this help message and exit
-f outFileName, --file outFileName
File Name where result is stored.
-c Package1 Package2, --compare Package1 Package2
Compare two packages.
-v Package, --verify Package
Verify Content of package.
kiran@kiran-laptop:~/Study/scripts$
码:
我使用下面的代码来实现输出,
#!/usr/bin/python
import sys
import argparse
def main():
usage='%(prog)s <functional argument> <ouput target argument>'
description='Package Compare/Verifier tool.'
parser = argparse.ArgumentParser(usage=usage,description=description)
parser.add_argument('-f','--file',action='store',nargs=1,dest='outFileName',help='File Name where result is stored.',metavar="outFileName",required=True)
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-c','--compare',action='store',nargs=2,dest='packageInfo',help='Compare two packages.',metavar=("Package1","Package2"))
group.add_argument('-v','--verify',action='store',nargs=1,dest='packageName',help='Verify Content of package.',metavar='Package')
args = parser.parse_args()
if __name__ == "__main__":
main()
将文件名设置为位置参数,并让argparse
设置自己的用法消息:
$ python so.py --help
usage: so.py [-h] [-c Package1 Package2 | -v Package] outFileName
文件名应该是位置文件,你应该让argparse
编写自己的用法消息。
#!/usr/bin/python
import sys
import argparse
def main():
description='Package Compare/Verifier tool.'
parser = argparse.ArgumentParser(description=description,
epilog='--compare and --verify are mutually exclusive')
parser.add_argument('f',action='store',nargs=1,
help='File Name where result is stored.',
metavar="outFileName")
group = parser.add_mutually_exclusive_group(required=False)
group.add_argument('-c','--compare',action='store',nargs=2,dest='packageInfo',help='Compare two packages.',metavar=("Package1","Package2"))
group.add_argument('-v','--verify',action='store',nargs=1,dest='packageName',help='Verify Content of package.',metavar='Package')
args = parser.parse_args()
if __name__ == "__main__":
main()
$ python so.py --help
usage: so.py [-h] [-c Package1 Package2 | -v Package] outFileName
Package Compare/Verifier tool.
positional arguments:
outFileName File Name where result is stored.
optional arguments:
-h, --help show this help message and exit
-c Package1 Package2, --compare Package1 Package2
Compare two packages.
-v Package, --verify Package
Verify Content of package.
--compare and --verify are mutually exclusive
您正在寻找什么样的输出? 我不知道在--help输出中表示相互排他性的任何标准语法,如果你做了一个,它可能会让你的用户感到困惑。 此外,我假设argparse不支持它的语法(因为如果它,它已经工作)。
我建议你保持简单,只需向用户解释每个参数的帮助中的互斥。 所以更改他们的帮助字符串如下:
-c Package1 Package2, --compare Package1 Package2
Compare two packages (may not be used with -v).
-v Package, --verify Package
Verify Content of package (may not be used with -c).
这非常明显,而且相当简洁。
另一个替代方案就是不提及它,并让用户通过尝试同时使用它们来发现它们是互斥的(argparse会自动生成一个用户友好的错误,例如“ PROG: error: argument -c: not allowed with argument -v
“)。
我认为基本的抱怨是默认的positional arguments
和optional arguements
组名。 在help
, optional arguments
意味着: requires a flag like -f or --file
; positional arguments
意味着it is identified by position
。 使用默认值,确实需要positionals
,并且optionals
确实是可选的(不是必需的)。 但是用户可以使用required
属性更改它,从而导致令人困惑的术语。
解决这个问题的方法是定义自己的参数组。 这些组会影响help
的布局,但对解析没有影响。 它们也不会影响usage
线。
def main():
description='Package Compare/Verifier tool.'
parser = argparse.ArgumentParser(usage=None,description=description)
maingroup = parser.add_argument_group(title='required')
maingroup.add_argument('-f','--file',nargs=1,dest='outFileName',help='File Name where result is stored.',metavar="outFileName",required=True)
exgroup = parser.add_argument_group(title='one or the other')
group = exgroup.add_mutually_exclusive_group(required=True)
group.add_argument('-c','--compare',nargs=2,dest='packageInfo',help='Compare two packages.',metavar=("Package1","Package2"))
group.add_argument('-v','--verify',nargs=1,dest='packageName',help='Verify Content of package.',metavar='Package')
args = parser.parse_args()
生产:
usage: stack5603364.py [-h] -f outFileName (-c Package1 Package2 | -v Package)
Package Compare/Verifier tool.
optional arguments:
-h, --help show this help message and exit
required:
-f outFileName, --file outFileName
File Name where result is stored.
one or the other:
-c Package1 Package2, --compare Package1 Package2
Compare two packages.
-v Package, --verify Package
Verify Content of package.
该mutually_exclusive_group
仅影响usage
线。
(-c Package1 Package2 | -v Package)
显示需要其中一个选项的组。
[-c Package1 Package2 | -v Package]
将是一个可选组。 []
用于标记可选(在“非必需”意义上)参数。 请注意-h
如何继续标记。
http://bugs.python.org/issue9694是相关的Python问题,其中argparse
作者喜欢这种argument_group
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.