相信很多刚开始学习深度学习算法代码的小伙伴,在一开始总会遇到关于argparse模块的代码,网上关于这方面的文章有很多但新手入门往往不是那么容易。本文从一个计算圆柱体体积的实例出发,帮助大家理解关于argparse模块的一些常见用法。
点击查看官方参考文档
argparse模块是命令行选项、参数和子命令解析器。可以让人轻松编写用户友好的命令行接口。适用于代码需要频繁地修改参数的情况。
先看下面一段没有使用argparse的代码
import math # 为了获取π
def cylinder_volume(radius, height):
vol = (math.pi) * (radius**2) * (height) # 体积公式
return vol
if __name__ == '__main__':
print(cylinder_volume(1, 3))
由以上可知,如果要计算其它圆柱体的体积,还需要在代码中修改半径和高度的参数。如果代码的规模很大,修改参数的过程会困难,不妨将这些需要频繁修改的参数放到代码外部,在命令行运行程序的时候一起输入,就用到了argparse模块。以下为修改后的代码
import math
import argparse # 导入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 test_argparse.py后输入参数半径1和高度3,这样就能在不修改代码的前提下得到想要的结果
1)首先导入argparse模块import argparse
2)创建一个 ArgumentParser 对象,该对象包含将命令行输入内容解析成 Python 数据的过程所需的全部功能。description是该对象的描述信息,可使用python test_argparse.py -h命令查看
parser = argparse.ArgumentParser(description='Calculate volume of a cylinder')
3)添加需要输入的命令行参数
parser.add_argument('radius', type=int, help='Radius of cylinder')
()中依次为参数名;参数类型,声明这个参数的数据类型为int为了参与运算,默认数据类型为str;描述信息
4)args = parser.parse_args()
ArgumentParser 通过 parse_args() 方法解析参数,获取到命令行中输入的参数。
5)将获取到的半径和高度args.radius, args.height作为参数传到方法中得出结果
python test_argparse.py 1 3
以上输入必须半径1在前,高度3在后,如果想改变输入的顺序或在输入参数同时携带参数名,可以使用选择型参数,在添加参数时参数名前加两个"-"
parser.add_argument('--radius', type=int, help='Radius of cylinder')
还有一种方法,通过“-”加上参数别名的形式,注意被"–"修饰的参数名必须存在:
parser.add_argument('-r', '--radius', type=int, help='Radius of cylinder')
parser.add_argument('-H', '--height', type=int, help='Height of cylinder')
首先通过-h查看描述信息
在添加参数那步增加metavar属性,设置为空字符串
parser.add_argument('-r', '--radius', type=int, metavar='', help='Radius of cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', help='Height of cylinder')
执行-h,结果和上面对比
将metavar属性设置为其它字符串,运行结果为
找不同,很简单
在添加参数那步可以自选添加required属性,在命令行输入的过程中如果你只具体指定了某几个参数,还有其它参数的值没有指定,也许可以运行完程序,那个没有被具体指定值的参数会被赋None值。required属性要求该参数必须被赋值,否则报错
parser.add_argument('-r', '--radius', type=int, metavar='', required=True, help='Radius of cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', required=True, help='Height of cylinder')
可以通过dest=xxx来设置参数的变量名取代“–xxx”,同样地在代码中用args.xxx来获取参数的值。
parser.add_argument('-r', dest='radius', type=int, help='Radius of cylinder')
parser.add_argument('-H', dest='height', type=int, help='Height of cylinder')
参考代码中的注释和运行结果
import math
import argparse
parser = argparse.ArgumentParser(description='Calculate volume of a cylinder')
parser.add_argument('-r', '--radius', type=int, metavar='', required=True, help='Radius of cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', required=True, help='Height of cylinder')
# 添加互斥组
group = parser.add_mutually_exclusive_group()
# 给互斥组添加两个参数
# 给参数的action属性赋值store_true,程序默认为false,当你执行这个命令的时候,默认值被激活成True
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:
print(volume)
elif args.verbose:
print('Volume of a Cylinder with radius %s and height %s is %s' % (args.radius, args.height, volume))
else:
print('Volume of Cylinder = %s' % volume)
# 这就是互斥参数如何工作的,你不能同时执行两个命令,你可以执行一个,所以和互斥组里的两个参数交互时,你只能
# 执行quiet和verbose中的一个,或者是都不执行按照默认计划来
# 使用: python test_argparse.py -r 2 -H 4
# python test_argparse.py -r 2 -H 4 -v
# python test_argparse.py -r 2 -H 4 -q