python之argparse模块学习

来源:互联网 发布:c语言头文件大全 编辑:程序博客网 时间:2024/06/06 09:56

python3版本的官方文档:https://docs.python.org/3/library/argparse.html

基础篇

程序什么都不做: prog.py

import argparseparser = argparse.ArgumentParser()parser.parse_args()

程序运行结果如下:

$ python prog.py$ python prog.py --help  usage: prog.py [-h]  optional arguments:  -h, --help  show this help message and exit$ python prog.py --verbose  usage: prog.py [-h]  prog.py: error: unrecognized arguments: --verbose$ python prog.py foo  usage: prog.py [-h]  prog.py: error: unrecognized arguments: foo

可以看出:

第一次运行脚本程序不加任何选项,结果没有任何输出。

第二次运行脚本程序开始显示argparse模块的用处了,我们神么都没有做就得到了一个很好的帮助信息。

–help选项或者-h选项是模块自带的,不可手动设定,否则会报错。

位置参数
例子

import argparseparser = argparse.ArgumentParser()parser.add_argument("echo")args = parser.parse_args()print args.echo

运行结果:

$ python prog.py  usage: prog.py [-h] echo  prog.py: error: the following arguments are required: echo$ python prog.py --help  usage: prog.py [-h] echo  positional arguments:    echo  optional arguments:    -h, --help  show this help message and exit$ python prog.py foofoo

可以看到:

我们使用add_argmuent()方法设定程序要接受的命令行位置参数,并命名它为echo,以显示其功能。

现在调用我们的程序需要设定一个位置参数。

parse_args()方法将返回命令行传入我们设定的位置参数的值,在这个例子里是echo的值。
不用额外指定变量,直接使用args.echo调用传入参数。
即使–help参数显示的帮助信息已经很nice了,我们有时候需要让用户详细了解每个参数的功能,所以我们让帮助信息更加的有用:

import argparseparser = argparse.ArgumentParser()parser.add_argument("echo", help="echo the string you use here")args = parser.parse_args()print args.echo

运行结果:

$ python prog.py -h  usage: prog.py [-h] echo  positional arguments:    echo        echo the string you use here  optional arguments:    -h, --help  show this help message and exit

那么,我们来实现一个更有用的功能:

import argparseparser = argparse.ArgumentParser()parser.add_argument("square", help="display a square of a given number")args = parser.parse_args()print args.square ** 2

运行结果:

$ python prog.py 4Traceback (most recent call last):  File "prog.py", line 5,  <module>     args.square**2TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

报错是因为argparse模块默认传入参数为string类型,除非手动指定类型,如下,指定类型为int:

import argparseparser = argparse.ArgumentParser()parser.add_argument("square", help="display a square of a given number",type=int)args = parser.parse_args()print args.square**2

运行结果:

$ python prog.py 416$ python prog.py fourusage: prog.py [-h] squareprog.py: error: argument square: invalid int value: 'four'

这次运行的就很好了。

可选参数

import argparseparser = argparse.ArgumentParser()parser.add_argument("--verbosity", help="increase output verbosity")args = parser.parse_args()if args.verbosity:    print"verbosity turned on"

运行结果:

$ python prog.py --verbosity 1  verbosity turned on$ python prog.py$ python prog.py --help  usage: prog.py [-h] [--verbosity VERBOSITY]  optional arguments:    -h, --help            show this help    message and exit    --verbosity VERBOSITY                        increase output verbosity$ python prog.py --verbosity  usage: prog.py [-h] [--verbosity VERBOSITY]  prog.py: error: argument --verbosity: expected one argument

可以看出:

当–verbosity参数设定时显示对应信息,不设定时,不显示任何信息。

该选项可以传入任何值,不设定时不报错,当可选参数不设定时,在这个例子下,args.verbosity值为None.

帮助信息略有不同

当使用–verbosity参数时,必须传入值,可以是任何值

上例程序中–verbosity接收任意整数值,但是对于我们程序功能来说,只需接收True或False值,所以我们来变通下:

import argparseparser = argparse.ArgumentParser()parser.add_argument("--verbose", help="increase output verbosity",                    action="store_true")args = parser.parse_args()if args.verbose:   print "verbosity turned on"

运行结果:

$ prog.py --verbose  verbosity turned on$ python prog.py --verbose 1  usage: prog.py [-h] [--verbose]  prog.py: error: unrecognized arguments: 1$ python prog.py --help  usage: prog.py [-h] [--verbose]  optional arguments:    -h, --help  show this help message and exit    --verbose   increase output verbosity

可以看出:

这个选项已经是一个flag类型的了,设定了这个参数就为True否则为False。

短选项参数
以一个例子开始:

import argparseparser = argparse.ArgumentParser()parser.add_argument("-v", "--verbose", help="increase output verbosity",                    action="store_true")args = parser.parse_args()if args.verbose:    print "verbosity turned on"

运行结果:

$ prog.py -v  verbosity turned on$ python prog.py --help  usage: prog.py [-h] [-v]  optional arguments:    -h, --help     show this help message and exit    -v, --verbose  increase output verbosity

可以看出,短选项参数和可选参数用法相同。

组合位置参数和可选参数
例子复杂化

import argparseparser = argparse.ArgumentParser()parser.add_argument("square", type=int,                    help="display a square of a given number")parser.add_argument("-v", "--verbose", action="store_true",                    help="increase output verbosity")args = parser.parse_args()answer = args.square**2if args.verbose:    print "the square of {} equals {}".format(args.square, answer)else:    print answer

运行结果:

$ prog.pyusage: prog.py [-h] [-v] squareprog.py: error: the following arguments are required: square$ python prog.py 416$ python prog.py 4 --verbosethe square of 4 equals 16$ python prog.py --verbose 4the square of 4 equals 16

再复杂下:

import argparseparser = argparse.ArgumentParser()parser.add_argument("square", type=int,                    help="display a square of a given number")parser.add_argument("-v", "--verbosity", type=int,                    help="increase output verbosity")args = parser.parse_args()answer = args.square**2if args.verbosity == 2:    print "the square of {} equals {}".format(args.square, answer)elif args.verbosity == 1:    print "{}^2 == {}".format(args.square, answer)else:    print answer

运行结果:

prog.py 416$ python prog.py 4 -vusage: prog.py [-h] [-v VERBOSITY] squareprog.py: error: argument -v/--verbosity: expected one argument$ python prog.py 4 -v 14^2 == 16$ python prog.py 4 -v 2the square of 4 equals 16$ python prog.py 4 -v 316

限制下–verbosity取值范围:

import argparseparser = argparse.ArgumentParser()parser.add_argument("square", type=int,                    help="display a square of a given number")parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],                    help="increase output verbosity")args = parser.parse_args()answer = args.square**2if args.verbosity == 2:    print "the square of {} equals {}".format(args.square, answer)elif args.verbosity == 1:    print "{}^2 == {}".format(args.square, answer)else:    print answer

运行结果:

$ prog.py 4 -v 3usage: prog.py [-h] [-v {0,1,2}] squareprog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)$ python prog.py 4 -husage: prog.py [-h] [-v {0,1,2}] squarepositional arguments:  square                display a square of a given numberoptional arguments:  -h, --help            show this help message and exit  -v {0,1,2}, --verbosity {0,1,2}                        increase output verbosity

下面我们来使用另一种更通用的方法来限制verbosity参数:

import argparseparser = argparse.ArgumentParser()parser.add_argument("square", type=int,                    help="display the square of a given number")parser.add_argument("-v", "--verbosity", action="count",                    help="increase output verbosity")args = parser.parse_args()answer = args.square**2if args.verbosity == 2:    print "the square of {} equals {}".format(args.square, answer)elif args.verbosity == 1:    print "{}^2 == {}".format(args.square, answer)else:    print answer

运行结果:

prog.py 416$ python prog.py 4 -v4^2 == 16$ python prog.py 4 -vvthe square of 4 equals 16$ python prog.py 4 --verbosity --verbositythe square of 4 equals 16$ python prog.py 4 -v 1usage: prog.py [-h] [-v] squareprog.py: error: unrecognized arguments: 1$ python prog.py 4 -husage: prog.py [-h] [-v] squarepositional arguments:  square           display a square of a given numberoptional arguments:  -h, --help       show this help message and exit  -v, --verbosity  increase output verbosity$ python prog.py 4 -vvv16

在这里,我们使用了另一个action——>count,它是用来计数对应的可选参数的个数,可以看出:
现在可选参数比之前(“action=store_true”)更像一个flag.
count其功能和store_true很像,如果不设定则其值为None.
最后的输出显示了一个bug
我们来修复它:

import argparseparser = argparse.ArgumentParser()parser.add_argument("square", type=int,                    help="display a square of a given number")parser.add_argument("-v", "--verbosity", action="count",                    help="increase output verbosity")args = parser.parse_args()answer = args.square**2# bugfix: replace == with >=if args.verbosity >= 2:    print "the square of {} equals {}".format(args.square, answer)elif args.verbosity >= 1:    print "{}^2 == {}".format(args.square, answer)else:    print answer

运行结果:

prog.py 4 -vvvthe square of 4 equals 16$ python prog.py 4 -vvvvthe square of 4 equals 16$ python prog.py 4Traceback (most recent call last):  File "prog.py", line 11, in <module>    if args.verbosity >= 2:TypeError: unorderable types: NoneType() >= int()

哦! 又有bug了,我们再改:

import argparseparser = argparse.ArgumentParser()parser.add_argument("square", type=int,                    help="display a square of a given number")parser.add_argument("-v", "--verbosity", action="count", default=0,                    help="increase output verbosity")args = parser.parse_args()answer = args.square**2if args.verbosity >= 2:    print "the square of {} equals {}".format(args.square, answer)elif args.verbosity >= 1:    print "{}^2 == {}".format(args.square, answer)else:    print answer

在这里,我们使用了一个关键字——default。并设置为0,当然如果不设置,则值为None。

运行结果:

prog.py 416

argparse模块很强大,到目前为止,我们只学了它其中的一点点。

更进一步
扩充下我们的程序:

import argparseparser = argparse.ArgumentParser()parser.add_argument("x", type=int, help="the base")parser.add_argument("y", type=int, help="the exponent")parser.add_argument("-v", "--verbosity", action="count", default=0)args = parser.parse_args()answer = args.x**args.yif args.verbosity >= 2:    print "{} to the power {} equals {}".format(args.x, args.y, answer)elif args.verbosity >= 1:    print "{}^{} == {}".format(args.x, args.y, answer)else:    print answer

输出结果:

prog.pyusage: prog.py [-h] [-v] x yprog.py: error: the following arguments are required: x, y$ python prog.py -husage: prog.py [-h] [-v] x ypositional arguments:  x                the base  y                the exponentoptional arguments:  -h, --help       show this help message and exit  -v, --verbosity$ python prog.py 4 2 -v4^2 == 16

冲突选项参数
到目前为止我们学习了argparse.ArgumentParser()的两种参数,下面我们学习下add_mutually_exclusive_group()的冲突选项参数。冲突参数允许我们设置相互冲突的选项。下面例子我们设置--quiet--verbose两个冲突选项:

import argparseparser = argparse.ArgumentParser()group = parser.add_mutually_exclusive_group()group.add_argument("-v", "--verbose", action="store_true")group.add_argument("-q", "--quiet", action="store_true")parser.add_argument("x", type=int, help="the base")parser.add_argument("y", type=int, help="the exponent")args = parser.parse_args()answer = args.x**args.yif args.quiet:    print answerelif args.verbose:    print "{} to the power {} equals {}".format(args.x, args.y, answer)else:    print "{}^{} == {}".format(args.x, args.y, answer)

输出结果:

prog.py 4 24^2 == 16$ python prog.py 4 2 -q16$ python prog.py 4 2 -v4 to the power 2 equals 16$ python prog.py 4 2 -vqusage: prog.py [-h] [-v | -q] x yprog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose$ python prog.py 4 2 -v --quietusage: prog.py [-h] [-v | -q] x yprog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose

更详细的帮助文档:

import argparseparser = argparse.ArgumentParser(description="calculate X to the power of Y")group = parser.add_mutually_exclusive_group()group.add_argument("-v", "--verbose", action="store_true")group.add_argument("-q", "--quiet", action="store_true")parser.add_argument("x", type=int, help="the base")parser.add_argument("y", type=int, help="the exponent")args = parser.parse_args()answer = args.x**args.yif args.quiet:    print answerelif args.verbose:    print "{} to the power {} equals {}".format(args.x, args.y, answer)else:    print "{}^{} == {}".format(args.x, args.y, answer)

输出结果:

prog.py --helpusage: prog.py [-h] [-v | -q] x ycalculate X to the power of Ypositional arguments:  x              the base  y              the exponentoptional arguments:  -h, --help     show this help message and exit  -v, --verbose  -q, --quiet

总结

这个帮助文档只是简介了下argparse,其更强大的功能请参考其官方文档。

原创粉丝点击