参考资料:
https://www.youtube.com/watch?v=cdblJqEUDNo&t=298s
不方便用梯子的也可以看B站:
Python argparse命令行参数解析包的详细使用说明书_哔哩哔哩_bilibili
以下是argparse笔记:
用法三步走:
①创建一个装参数的容器。
②往容器里面添加参数。
③解析容器里面的参数。
1.positional argument
特点:
①参数名前面没有横杠。
②不同的参数,输入的先后顺序不能改变。
③运行的时候不能输入参数名(输入参数名会报错),只需输入参数值。即:
python 文件名 参数值1 参数值2
以计算圆柱体积的代码为例。新建demo1.py。
import math
import argparse
parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
parser.add_argument('radius', type=int, help='Radius of Cylinder')
parser.add_argument('height', type=int, help='Height of Cylinder')
args = parser.parse_args()
def cylinder_volume(radius, height):
vol = (math.pi) * (radius ** 2) * (height)
return vol
if __name__ == '__main__':
print (cylinder_volume(args.radius, args.height))
查看帮助信息,在终端输入:
python demo1.py -h
终端显示:
usage: demo1.py [-h] radius height
Calculate volume of a Cylinder #parser定义的时候,description里面的内容
positional arguments:
radius Radius of Cylinder
height Height of Cylinder
optional arguments:
-h, --help show this help message and exit
计算 radius=2 height=4 的圆柱体积:
python demo1.py 2 4
结果:
50.26548245743669
交换一下参数输入的顺序:
python demo1.py 4 2
结果:
100.53096491487338
#计算的是 radius=4 height=2的圆柱体积
2.optional argument
特点:
①参数名之前有横杠。
②运行的时候要带参数值。即
python 文件名 参数名1 参数值1 参数名2 参数值2...
③参数值可以交换顺序,对运行结果没有影响。即
python 文件名 参数名2 参数值2 参数名1 参数值1 ...
④因为输入的参数值可以交换顺序,所以输入的时候必须带上参数名,否则报错。
新建demo2.py
import math
import argparse
parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
parser.add_argument('--radius', type=int, help='Radius of Cylinder')#注意双横杠!
parser.add_argument('--height', type=int, help='Height of Cylinder')
args = parser.parse_args()
def cylinder_volume(radius, height):
vol = (math.pi) * (radius ** 2) * (height)
return vol
if __name__ == '__main__':
print (cylinder_volume(args.radius, args.height))
查看帮助信息:
python demo2.py -h
显示
usage: demo2.py [-h] [--radius RADIUS] [--height HEIGHT]
Calculate volume of a Cylinder
optional arguments:
-h, --help show this help message and exit
--radius RADIUS Radius of Cylinder #有横杠之后变成可选参数了!
--height HEIGHT Height of Cylinder
计算 radius=2 height=4 的圆柱体积:
python demo2.py --radius 2 --height 4
或者:
python demo2.py --height 4 --radius 2
输出都是 半径为2 高度为4 的圆柱体的体积!
50.26548245743669
注意,因为前面参数定义的时候是:
--radius --height
所以后面参数调用的地方是:
args.radius args.height
一定要对应起来哦!
不过每次都输入这么长的参数名太麻烦了,那就在参数定义的地方,再另外输入一个以单横杠开头的,简写的参数名。即:
parser.add_argument('-r', '--radius', type=int, help='Radius of Cylinder')
或者:
parser.add_argument('--radius', '-r',type=int, help='Radius of Cylinder')
--radius和-r完全等价,顺序可以交换,只需要注意,真正的参数名以双横杠开头,简写的参数名以单横杠开头。
把height这个参数也改一下。
parser.add_argument('-H', '--height', type=int, help='Height of Cylinder')
大写-H是因为,小写的-h已经被 帮助 占用啦!
计算 radius=2 height=4 的圆柱体积,以下八种参数输入方式完全等价:
python demo2.py -r 2 -H 4
python demo2.py -H 4 -r 2
python demo2.py --radius 2 --height 4
python demo2.py --height 4 --radius 2
python demo2.py --radius 2 -H 4
python demo2.py --H 4 --radius 2
python demo2.py -r 2 --height 4
python demo2.py --height 4 -r 2
输出都是:
50.26548245743669
再来完善一下~
help信息显示得有点乱,-r 后面紧跟的是RADIUS。
usage: demo2.py [-h] [-r RADIUS] [-H HEIGHT]
Calculate volume of a Cylinder
optional arguments:
-h, --help show this help message and exit
-r RADIUS, --radius RADIUS
Radius of Cylinder
-H HEIGHT, --height HEIGHT
Height of Cylinder
在添加参数的时候,写上metavar等于空字符串,就把原来的RADIUS HEIGHT这些替换为空字符串了。上代码:
parser.add_argument('-r', '--radius', type=int, metavar='', help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', help='Height of Cylinder')
metavar=空字符串 也可以写在其他位置,只要写在参数名'-r', '--radius'之后即可。比如:
parser.add_argument('-r', '--radius', type=int, help='Radius of Cylinder', metavar='')
parser.add_argument('-H', '--height', type=int, metavar='', help='Height of Cylinder')
现在的help信息变得很整齐:
usage: demo2.py [-h] [-r] [-H]
Calculate volume of a Cylinder
optional arguments:
-h, --help show this help message and exit
-r , --radius Radius of Cylinder
-H , --height Height of Cylinder
如果运行代码的时候少输入了一个参数,那么会默认它是None,就会报错。比如:
python demo2.py -r 2
报错:
Traceback (most recent call last):
File "/home/yukey/Documents/NLP_Code_All/argparse参数解析/demo2.py", line 22, in <me>
print (cylinder_volume(args.radius, args.height))
File "/home/yukey/Documents/NLP_Code_All/argparse参数解析/demo2.py", line 18, in cyer_volume
vol = (math.pi) * (radius ** 2) * (height)
TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'
在添加参数的时候写上required=True,当缺少该参数的时候就会有提示了。同样地,required=True写在参数名后面的任意位置都可以。
parser.add_argument('-r', '--radius', type=int, help='Radius of Cylinder', metavar='', required=True)
parser.add_argument('-H', '--height', required=True, type=int, metavar='', help='Height of Cylinder')
输入:
python demo2.py -r 2
提示:
usage: demo2.py [-h] -r -H
demo2.py: error: the following arguments are required: -H/--height
3.mutually exclusive group
互斥组,字面上理解就是一组参数,里面的参数关系是互斥的,只能有一个True,其余为False。
下面以设置三种输出格式为例,这三种情况是互斥的。
①quiet:只输出一个数字。
②verbose:输出很啰嗦的一串说明文字+数字。
③不指定互斥参数:输出一句话+数字。
新建demo3.py 上代码:
import math
import argparse
parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
parser.add_argument('-r', '--radius', required=True, type=int, metavar='', help='Radius of Cylinder')
parser.add_argument('-H', '--height', required=True, type=int, metavar='', help='Height of Cylinder')
group = parser.add_mutually_exclusive_group()
group.add_argument('-q', '--quiet', action='store_true', help='print quiet')
group.add_argument('-v', '--verbose', action='store_true', help='print verbose')
args = parser.parse_args()
def cylinder_volume(radius, height):
vol = (math.pi) * (radius ** 2) * (height)
return vol
if __name__ == '__main__':
volume = cylinder_volume(args.radius, args.height)
if args.quiet: #指定-q
print(volume)
elif args.verbose: #指定-v
print("Volume of a Cylinder with radius %s and height %s and height %s is %s" % (args.radius, args.height, volume))
else: #既不指定-q 也不指定-v
print("Volume of Cylinder = %s" % volume)
注意,新添加的group这个容器是在原来的parser的基础上再add mutually exclusive group,而不是另起炉灶!
其中action='store_true'的意思是,指定这个参数的时候,该参数就是True。博主的原话是:When you give it an action,it stores true. The default become False。
显示一下帮助信息:
python demo3.py -h
帮助信息如下:
usage: demo3.py [-h] -r -H [-q | -v]
Calculate volume of a Cylinder
optional arguments:
-h, --help show this help message and exit
-r , --radius Radius of Cylinder
-H , --height Height of Cylinder
-q, --quiet print quiet
-v, --verbose print verbose
指定-q:
python demo3.py -r 2 -H 4 -q
输出:
50.26548245743669
指定-v:
python demo3.py -r 2 -H 4 -v
输出:
Volume of a Cylinder with radius 2 and height 4 and height is 50.26548245743669
既不指定-q 也不指定-v:
python demo3.py -r 2 -H 4
输出:
Volume of Cylinder = 50.26548245743669