argparse模块是python自带的命令行参数解析包,可以用来方便地读取命令行参数。当你的代码需要频繁地修改参数的时候,使用argparse可以将参数和代码分离开来,让你的代码更简洁,适用范围更广。argparse模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时给出错误信息。
希望大家可以关注下公众号,支持一下,鞠躬感谢~
代码示例
这里以 [YOLOv5目标检测]中的detect.py
为例,来看看argparse
的基本用法
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="工程编译工具") 创造一个解析对象parser,这差不多就是一个装载参数的容器。可以给这个对象写一个描述,描述一下这个解析对象。
给这个解析对象添加几个命令行参数。
参数名字前面加上--,这就表示这是个选择性参数optional arguments。不加上--那就是必须填的位置参数positional arguments。也可以在--参数名前面加上-,设定参数的简短形式。比如'-r',当调用-参数名,其实就是调用后面的--参数名。 好处:有了这些flag,我们就可以随意改变他们的顺序。
parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')
parser.add_argument('--source', type=str, default='inference/images', help='source') # file/folder, 0 for webcam
parser.add_argument('--output', type=str, default='inference/output', help='output folder') # output folder
parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
parser.add_argument('--conf-thres', type=float, default=0.4, help='object confidence threshold')
parser.add_argument('--iou-thres', type=float, default=0.5, help='IOU threshold for NMS')
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--view-img', action='store_true', help='display results')
parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
parser.add_argument('--augment', action='store_true', help='augmented inference')
parser.add_argument('--update', action='store_true', help='update all models')
opt = parser.parse_args() 利用opt对象,给这些命令行参数传递数值。就是在这个.py模块执行的的后面 添加自己传入的值。
print(opt) 上面所设置的命令行参数,都变成了opt对象的属性了。
with torch.no_grad():
if opt.update: # update all models (to fix SourceChangeWarning)
for opt.weights in ['yolov5s.pt', 'yolov5m.pt', 'yolov5l.pt', 'yolov5x.pt']:
detect()
strip_optimizer(opt.weights)
else:
detect()
对上述代码稍微解释一下。第一步是创建一个ArgumentParser
对象,这个对象包含将命令行解析成python
数据类型所需的全部信息。
parser = argparse.ArgumentParser()
接下来,可以通过add_argument()
方法来给parser
对象添加程序参数信息了。
parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')
像这样对象.方法调用。每一行,增加一个参数。
add_argument
方法声明
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
它定义单个的命令行参数应当如何解析。每个形参的含义如下
- name or flags - 一个命名或者一个选项字符串的列表,例如
weight
或w
,-weight
。第一个就是参数名称。后面是对应的属性。 - action - 当参数在命令行中出现时使用的动作基本类型。
store_true
和store_false
是store_const
分别用作存储True
和False
值的特殊用例,它们的默认值分别为False
和True
- nargs - 命令行参数(就是Python模块后面输入的参数)应当消耗的数目,可选值为:
?
表示0或1个参数,*
表示0或所有参数;+
表示至少一个参数。 - const - 被一些
action
和nargs
选择所需求的常数 - default - 当参数未在命令行中出现时使用的默认值。
- type - 被传入参数需要被转换成的数据类型,默认数据类型是str
- choices - 参数值只能从几个选项里面选择
- required - 此命令行选项表示命令行参数是否可省略,设置为
True
,当没有传入命令行参数时,会有提示信息把未输入的命令行参数输入;不设置的话,不传入命令行参数,会直接报错。 - help - 此选项作用是简单描述,就是来写帮助信息,是字符串。
- metavar - 在使用方法消息中使用的参数值示例
- dest - 设置参数在代码中的变量名
最后一步,parser
通过parse_args()
方法解析参数,将参数字符串转换为对象并将其设为命名空间的属性,返回带有成员的命名空间。
opt = parser.parse_args()
得到了opt
后,就可以去获取对应参数对应的值了。比如就可以通过opt.weights
访问weights
文件路径,opt.img-size
访问图片的大小。
如果不知道脚本如何使用,可以使用python detect.py -h
或python detect.py --help
来查看detect.py
脚本支持的参数以及对应的帮助信息
(yolov5v3) xugaoxiang@1070Ti:~/Works/github/yolov5_v3/yolov5-3.0$ python detect.py -h
usage: detect.py [-h] [--weights WEIGHTS [WEIGHTS ...]] [--source SOURCE]
[--output OUTPUT] [--img-size IMG_SIZE]
[--conf-thres CONF_THRES] [--iou-thres IOU_THRES]
[--device DEVICE] [--view-img] [--save-txt]
[--classes CLASSES [CLASSES ...]] [--agnostic-nms]
[--augment] [--update]
optional arguments:
-h, --help show this help message and exit -h是模块默认持有的。
--weights WEIGHTS [WEIGHTS ...]
model.pt path(s)
--source SOURCE source
--output OUTPUT output folder
--img-size IMG_SIZE inference size (pixels)
--conf-thres CONF_THRES
object confidence threshold
--iou-thres IOU_THRES
IOU threshold for NMS
--device DEVICE cuda device, i.e. 0 or 0,1,2,3 or cpu
--view-img display results
--save-txt save results to *.txt
--classes CLASSES [CLASSES ...]
filter by class: --class 0, or --class 0 2 3
--agnostic-nms class-agnostic NMS
--augment augmented inference
--update update all models