1. argparse 介绍
是 python 的一个命令行解析包, 非常编写可读性非常好的程序
2. 基本用法
prog.py 是我在 Linux 下测试 argparse 的文件, 放在 / tmp 目录下, 其内容如下:
- #!/usr/bin/env python
- # encoding: utf-8
- import argparse
- parser = argparse.ArgumentParser()
- parser.parse_args()
测试:
- yarving@yarving-VirtualBox /tmp $ python prog.py
- yarving@yarving-VirtualBox /tmp $ python prog.py --help
- usage: prog.py [-h]
- optional arguments:
- -h, --help show this help message and exit
- yarving@yarving-VirtualBox /tmp $ python prog.py -v
- usage: prog.py [-h]
- prog.py: error: unrecognized arguments: -v
- yarving@yarving-VirtualBox /tmp $ python prog.py foo
- usage: prog.py [-h]
- prog.py: error: unrecognized arguments: foo
第一个没有任何输出和出错
第二个测试为打印帮助信息, argparse 会自动生成帮助文档
第三个测试为未定义的 - v 参数, 会出错
第四个测试为未定义的参数 foo, 出错
3. positional arguments
positional arguments 为英文定义, 中文名叫有翻译为定位参数的, 用法是不用带 - 就可用
修改 prog.py 的内容如下:
- #!/usr/bin/env python
- # encoding: utf-8
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("echo")
- args = parser.parse_args()
- print args.echo
执行测试如下
- yarving@yarving-VirtualBox /tmp $ python prog.py
- usage: prog.py [-h] echo
- prog.py: error: too few arguments
- yarving@yarving-VirtualBox /tmp $ python prog.py -h
- usage: prog.py [-h] echo
- positional arguments:
- echo
- optional arguments:
- -h, --help show this help message and exit
- yarving@yarving-VirtualBox /tmp $ python prog.py hahahaha
- hahahaha
定义了一个叫 echo 的参数, 默认必选
第一个测试为不带参数, 由于 echo 参数为空, 所以报错, 并给出用法 (usage) 和错误信息
第二个测试为打印帮助信息
第三个测试为正常用法, 回显了输入字符串 hahahaha
4. optional arguments
中文名叫可选参数, 有两种方式:
一种是通过一个 - 来指定的短参数, 如 - h;
一种是通过 -- 来指定的长参数, 如 --help
这两种方式可以同存, 也可以只存在一个, 修改 prog.py 内容如下:
- #!/usr/bin/env python
- # encoding: utf-8
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("-v", "--verbosity", help="increase output verbosity")
- args = parser.parse_args()
- if args.verbosity:
- print "verbosity turned on"
注意这一行: parser.add_argument("-v", "--verbosity", help="increase output verbosity")
定义了可选参数 - v 或 --verbosity, 通过解析后, 其值保存在 args.verbosity 变量中
用法如下:
- yarving@yarving-VirtualBox /tmp $ python prog.py -v 1
- verbosity turned on
- yarving@yarving-VirtualBox /tmp $ python prog.py --verbosity 1
- verbosity turned on
- yarving@yarving-VirtualBox /tmp $ python prog.py -h
- usage: prog.py [-h] [-v VERBOSITY]
- optional arguments:
- -h, --help show this help message and exit
- -v VERBOSITY, --verbosity VERBOSITY
- increase output verbosity
- yarving@yarving-VirtualBox /tmp $ python prog.py -v
- usage: prog.py [-h] [-v VERBOSITY]
- prog.py: error: argument -v/--verbosity: expected one argument
测试 1 中, 通过 - v 来指定参数值
测试 2 中, 通过 --verbosity 来指定参数值
测试 3 中, 通过 - h 来打印帮助信息
测试 4 中, 没有给 - v 指定参数值, 所以会报错
5. action='store_true'
上一个用法中 - v 必须指定参数值, 否则就会报错, 有没有像 - h 那样, 不需要指定参数值的呢, 答案是有, 通过定义参数时指定 action="store_true" 即可, 用法如下
- #!/usr/bin/env python
- # encoding: utf-8
- 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"
测试:
- yarving@yarving-VirtualBox /tmp $ python prog.py -v
- verbosity turned on
- yarving@yarving-VirtualBox /tmp $ python prog.py -h
- usage: prog.py [-h] [-v]
- optional arguments:
- -h, --help show this help message and exit
- -v, --verbose increase output verbosity
第一个例子中,-v 没有指定任何参数也可, 其实存的是 True 和 False, 如果出现, 则其值为 True, 否则为 False
6. 类型 type
默认的参数类型为 str, 如果要进行数学计算, 需要对参数进行解析后进行类型转换, 如果不能转换则需要报错, 这样比较麻烦
argparse 提供了对参数类型的解析, 如果类型不符合, 则直接报错. 如下是对参数进行平方计算的程序:
- #!/usr/bin/env python
- # encoding: utf-8
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument('x', type=int, help="the base")
- args = parser.parse_args()
- answer = args.x ** 2
- print answer
测试
- yarving@yarving-VirtualBox /tmp $ python prog.py 2
- 4
- yarving@yarving-VirtualBox /tmp $ python prog.py two
- usage: prog.py [-h] x
- prog.py: error: argument x: invalid int value: 'two'
- yarving@yarving-VirtualBox /tmp $ python prog.py -h
- usage: prog.py [-h] x
- positional arguments:
- x the base
- optional arguments:
- -h, --help show this help message and exit
第一个测试为计算 2 的平方数, 类型为 int, 正常
第二个测试为一个非 int 数, 报错
第三个为打印帮助信息
7. 可选值 choices=[]
5 中的 action 的例子中定义了默认值为 True 和 False 的方式, 如果要限定某个值的取值范围, 比如 6 中的整形, 限定其取值范围为 0, 1, 2, 该如何进行呢?
修改 prog.py 文件如下:
- #!/usr/bin/env python
- # encoding: utf-8
- import argparse
- parser = 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**2
- 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
测试如下:
- yarving@yarving-VirtualBox /tmp $ python prog.py 4 -v 0
- 16
- yarving@yarving-VirtualBox /tmp $ python prog.py 4 -v 1
- 4^2 == 16
- yarving@yarving-VirtualBox /tmp $ python prog.py 4 -v 2
- the square of 4 equals 16
- yarving@yarving-VirtualBox /tmp $ python prog.py 4 -v 3
- usage: prog.py [-h] [-v {0,1,2}] square
- prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
- yarving@yarving-VirtualBox /tmp $ python prog.py -h
- usage: prog.py [-h] [-v {0,1,2}] square
- positional arguments:
- square display a square of a given number
- optional arguments:
- -h, --help show this help message and exit
- -v {0,1,2}, --verbosity {0,1,2}
- increase output verbosity
测试 1, 2, 3 为可选值范围, 通过其值, 打印不同的格式输出;
测试 4 的 verbosity 值不在可选值范围内, 打印错误
测试 5 打印帮助信息
8. 自定义帮助信息 help
上面很多例子中都为 help 赋值, 如
parser.add_argument("square", type=int, help="display a square of a given number")
在打印输出时, 会有如下内容
- positional arguments:
- square display a square of a given number
也就是 help 为什么, 打印输出时, 就会显示什么
9. 程序用法帮助
8 中介绍了为每个参数定义帮助文档, 那么给整个程序定义帮助文档该怎么进行呢?
通过 argparse.ArgumentParser(description="calculate X to the power of Y")即可
修改 prog.py 内容如下:
- #!/usr/bin/env python
- # encoding: utf-8
- import argparse
- parser = 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.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)
打印帮助信息时即显示 calculate X to the power of Y
- yarving@yarving-VirtualBox /tmp $ python prog.py -h
- usage: prog.py [-h] [-v | -q] x y
- calculate X to the power of Y
- positional arguments:
- x the base
- y the exponent
- optional arguments:
- -h, --help show this help message and exit
- -v, --verbose
- -q, --quiet
10. 互斥参数
在上个例子中介绍了互斥的参数
- group = parser.add_mutually_exclusive_group()
- group.add_argument("-v", "--verbose", action="store_true")
- group.add_argument("-q", "--quiet", action="store_true")
第一行定义了一个互斥组, 第二, 三行在互斥组中添加了 - v 和 - q 两个参数, 用上个例子中的程序进行如下测试:
- yarving@yarving-VirtualBox /tmp $ python prog.py 4 2
- 4^2 == 16
- yarving@yarving-VirtualBox /tmp $ python prog.py 4 2 -v
- 4 to the power 2 equals 16
- yarving@yarving-VirtualBox /tmp $ python prog.py 4 2 -q
- 16
- yarving@yarving-VirtualBox /tmp $ python prog.py 4 2 -q -v
可以看出,-q 和 - v 不出现, 或仅出现一个都可以, 同时出现就会报错.
可定义多个互斥组
11. 参数默认值
介绍了这么多, 有没有参数默认值该如何定义呢?
修改 prog.py 内容如下:
- #!/usr/bin/env python
- # encoding: utf-8
- import argparse
- parser = argparse.ArgumentParser(description="calculate X to the power of Y")
- 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], default=1,
- help="increase output verbosity")
- args = parser.parse_args()
- answer = args.square**2
- 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
测试结果如下
- yarving@yarving-VirtualBox /tmp $ python prog.py 8
- 8^2 == 64
- yarving@yarving-VirtualBox /tmp $ python prog.py 8 -v 0
- 64
- yarving@yarving-VirtualBox /tmp $ python prog.py 8 -v 1
- 8^2 == 64
- yarving@yarving-VirtualBox /tmp $ python prog.py 8 -v 2
- the square of 8 equals 64
可以看到如果不指定 - v 的值, args.verbosity 的值默认为 1, 为了更清楚的看到默认值, 也可以直接打印进行测试.
来源: http://www.bubuko.com/infodetail-2977624.html