这篇文章很早就想写了,拖了好久哦~ 不废话了,直奔主题
argparse是一个命令行参数解析模块
先看一个小栗子看看这个模块是怎么使用的:
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
将上面几行代码保存成脚本文件prog.py,并在命令行运行这个脚本文件:
(tf13) D:\study\csdn>python prog.py
(tf13) D:\study\csdn>python prog.py --help
usage: prog.py [-h]
optional arguments:
-h, --help show this help message and exit
(tf13) D:\study\csdn>python prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
可以看出输入不同的命令,打印出的结果不同.不加任何选项情况直接运行脚本文件没有任何输出;–help选项,也可以缩短为-h,是一个帮助信息,是我们免费获得的唯一选项(即无需指定);此时指定其他任何内容都会导致错误(参数未识别)
添加位置参数
在脚本文件中添加代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
通过add_argument()
方法添加参数,此时运行脚本文件:
(tf13) D:\study\csdn>python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
(tf13) D:\study\csdn>python prog.py --help
usage: prog.py [-h] echo
positional arguments:
echo
optional arguments:
-h, --help show this help message and exit
(tf13) D:\study\csdn>python prog.py foo
foo
输入第一条命令时,返回一条错误信息(error: the following arguments are required: echo),因此添加完位置参数,必须在命令行中指定,不然会报错;第二条命令在命令行添加了--help
选项,这是一条帮助信息,告诉你需要一个位置参数echo
;通过第二条命令,我们在命令行指定了位置参数foo
,脚本文件中的print(args.echo)
代码则将赋给echo
的参数foo
打印了出来
添加帮助信息
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)
此时在命令行输出帮助信息:
D:\study\csdn>python prog.py --help
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 argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print("verbosity turned on")
命令行输出
D:\study\csdn>python prog.py --verbosity 1
verbosity turned on
D:\study\csdn>python prog.py
D:\study\csdn>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
对比第一条与第二条命令的输出可以看出,命令行不指定--verbosity
也不会报错。
如果想要输入的参数只有True
与False
两个值,可以添加新的关键字action,并将其值设置为‘store_true’.这表明指定了该选项,则将True
分配给args.verbose
,未指定则表示为False
:
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")
输出:
(tf13) D:\study\csdn>python prog.py --verbose
verbosity turned on
(tf13) D:\study\csdn>python prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
(tf13) D:\study\csdn>python prog.py --help
usage: prog.py [-h] [--verbose]
optional arguments:
-h, --help show this help message and exit
--verbose increase output verbosity
此时将参数指定为1会报错
短选项
短选项的用法非常简单,具体用法:
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")
然后输出:
(tf13) D:\study\csdn>python prog.py -v
verbosity turned on
(tf13) D:\study\csdn>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)
其中square
是位置参数,并且指定为一个整型数,verbose
是可选参数,输出:
(tf13) D:\study\csdn>python prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
(tf13) D:\study\csdn>python prog.py 4
16
(tf13) D:\study\csdn>python prog.py 4 --verbose
the square of 4 equals 16
(tf13) D:\study\csdn>python prog.py --verbose 4
the square of 4 equals 16
在命令行指定可选参数与位置参数的顺序无关紧要
接下来再举几个栗子吧
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,
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)
输出:
D:\study\csdn>python prog.py 4
16
D:\study\csdn>python prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument
D:\study\csdn>python prog.py 4 -v 1
4^2 == 16
D:\study\csdn>python prog.py 4 -v 2
the square of 4 equals 16
D:\study\csdn>python prog.py 4 -v 3
16
我们还可以限制–verbosity选项可以接受的值:
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)
可以看出,此时verbosity被限制在了0,1,2三个数之间:
D:\study\csdn>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)
D:\study\csdn>python prog.py 4 -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
D:\study\csdn>python prog.py 4 -v 1
4^2 == 16
action的另一个操作:count
,可以计算特定可选参数的出现次数。
import argparse
parser = 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**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)
输出:
D:\study\csdn>python prog.py 4
16
D:\study\csdn>python prog.py 4 -v
4^2 == 16
D:\study\csdn>python prog.py 4 -vv
the square of 4 equals 16
D:\study\csdn>python prog.py 4 --verbosity --verbosity
the square of 4 equals 16
D:\study\csdn>python prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1
D:\study\csdn>python prog.py 4 -h
usage: prog.py [-h] [-v] square
positional arguments:
square display the square of a given number
optional arguments:
-h, --help show this help message and exit
-v, --verbosity increase output verbosity
D:\study\csdn>python prog.py 4 -vvv
16
互相冲突的选项
最后介绍冲突选项: add_mutually_exclusive_group()
可以允许我们指定相互冲突的选项。
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))
输出:
D:\study\csdn>python prog.py --help
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
D:\study\csdn>python prog.py 4 2
4^2 == 16
D:\study\csdn>python prog.py 4 2 -q
16
D:\study\csdn>python prog.py 4 2 -v
4 to the power 2 equals 16
D:\study\csdn>python prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
帮助文档中的[-v | -q]告诉我们可以使用-v或-q,但不能同时使用~
写在最后:
更具体的内容可以参考:https://docs.python.org/3/howto/argparse.html#conflicting-options
继续加油吧~ 又是美好的一天~