MENU

Python argparse库使用介绍

May 3, 2018 • 编程开发

简介

argparse库提供了一系列用于解析命令行参数的功能,使用起来十分灵活。


项目是由Python3编写的,与python2版本的略有不同,特别是在异常信息方面。
Python2版本的官方简介地址:python2-argparse
Python3版本的在这里:python3-argparse

理念

基本功能

位置参数

  • 默认使用

    import argparse
    parser = argparse.ArgumentParser()
    parser.parse_args()
  • 位置参数、参数说明

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("echo", help="The message you want to print.")
    args = parser.parse_args()
    print args.echo

    可以看出,在第一个位置设置了一个参数。如果执行该脚本,就必须添加一个参数。
    add_argument()方法的help参数可以添加参数的帮助说明。

    usage: test.py [-h] echo
    test.py: error: too few arguments
    [[email protected] test]# python test.py -h
    usage: test.py [-h] echo
    
    positional arguments:
      echo        The message you want to print.
    
    optional arguments:
      -h, --help  show this help message and exit
    [[email protected] test]# python test.py hello world
    usage: test.py [-h] echo
    test.py: error: unrecognized arguments: world
    [[email protected] test]# python test.py "hello world"
    hello world
    [[email protected] test]#
  • 参数类型

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

可选参数

  • 基本可选参数

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

    注意,如果可选参数没有使用,那么解析出的变量值为None

    [[email protected] test]# python test.py "test"
    test
    [[email protected] test]# python test.py "test" --verbosity
    usage: test.py [-h] [--verbosity VERBOSITY] echo
    test.py: error: argument --verbosity: expected one argument
    [[email protected] test]# python test.py "test" --verbosity 1
    test, length:4
    [[email protected] test]# python test.py "test" --verbosity on
    test, length:4
    [[email protected] test]# python test.py "test" --verbosity asdewf23
    test, length:4
    [[email protected] test]#
  • 不设置参数值

    • 使用action="store_true"选项

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

    参数一旦使用,解析后对应名称变量的值为True,否则为False

    $ python 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

短选项参数

  • 可选短参数

    import argparse
    parser = 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"

    这里的-v和--vebose是同样的意义。

    $ python 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 argparse
parser = 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**2
if args.verbose:
    print "the square of {} equals {}".format(args.square, answer)
else:
    print answer
$ python prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python prog.py 4
16
$ python prog.py 4 --verbose
the square of 4 equals 16
$ python prog.py --verbose 4
the square of 4 equals 16

注意这里位置参数的顺序并不影响。

  • 注意,可选参数如果不使用,那么默认情况下就是None。这是如果使用该参数进行条件判断时,可能会出现错误。

    import argparse
    parser = 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
在这里,最后一个使用时,没有使用-v选项,导致判断出错。
$ python prog.py 4 -vvv
the square of 4 equals 16
$ python prog.py 4 -vvvv
the square of 4 equals 16
$ python prog.py 4
Traceback (most recent call last):
  File "prog.py", line 11, in <module>
    if args.verbosity >= 2:
TypeError: unorderable types: NoneType() >= int()
此时可以使用`default`进行设置:
parser.add_argument("-v", "--verbosity", action="count", default=0,
                help="increase output verbosity")
$ python prog.py 4
16

高级功能

叠加参数

利用参数:

  • action='count'
  • default=0

    import argparse
    parser = argparse.ArgumentParser()
    
    parser.add_argument('x', type=int, help="variable x")
    parser.add_argument('y', type=int, help="variable y")
    parser.add_argument('-v', '--verbosity', action='count', default=0)
    
    arguments = parser.parse_args()
    
    if arguments.verbosity >= 2:
        print('X*Y=', arguments.x * arguments.y)
    else:
        print(arguments.x * arguments.y)

可以看出使用-v和-vv产生了不同的输出。在实际的项目中,可以对参数叠加数量进行判断,人工的实现不同层级的显示。

[[email protected] test]# python test.py 1 2
2
[[email protected] test]# python test.py 2 3
6
[[email protected] test]# python test.py 2 3 -v
2^3 == 6
[[email protected] test]# python test.py 2 3 -vv
2 to the power 3 equals 6
[[email protected] test]# python test.py 2 3 --verbosity --verbosity
2 to the power 3 equals 6
[[email protected] test]#

互斥选项

实现方式:利用add_mutually_exclusive_group()方法生成一个互斥组,继续使用add_argument()添加参数,该组的参数不能同时使用。

parser = 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.y

if args.quiet:
    print answer
elif args.verbose:
    print "{} to the power {} equals {}".format(args.x, args.y, answer)
else:
    print "{}^{} == {}".format(args.x, args.y, answer)

可以看出,-v和-q参数不能同时使用,否则产生冲突。

[[email protected] test]# python test.py  1 2
1^2 == 1
[[email protected] test]# python test.py 2 3
2^3 == 8
[[email protected] test]# python test.py 2 3 -v
2 to the power 3 equals 8
[[email protected] test]# python test.py 2 3 -q
8
[[email protected] test]# python test.py 2 3 -q -v
usage: test.py [-h] [-v | -q] x y
test.py: error: argument -v/--verbose: not allowed with argument -q/--quiet
[[email protected] test]#

参考链接

Tags: python
Archives QR Code
QR Code for this page
Tipping QR Code