python中argparse模块关于 parse_args() 函数详解(全)

article/2025/10/20 3:52:47

目录

  • 前言
  • 1. 函数讲解
  • 2. 基本用法
  • 3. 实战讲解

前言

  • 原理:命令行解析使用argparse包
  • 作用:命令行传参赋值 可用在机器学习深度学习 或者 脚本运行等

了解这个函数需要了解其背后的原理以及具体参数

1. 函数讲解

在深度学习模型框架中几乎都有的模块
浓缩后的示例代码:

# 导入模块包
import argparse# 解析对象ArgumentParser,description程序描述
parser=argparse.ArgumentParser(description=" parse_args() 函数讲解")# 对象值赋参(可选 或者 必选),指定该程序需要接受的命令参数
parser.add_argument('--weights', default=ROOT / 'yolov5s.pt', help='model path or triton URL')# 增加后的属性赋值给args
args=parser.parse_args()

主要的对象值赋参,对应的参数具体如下:
在这里插入图片描述
主要有两种情况:

  • 位置参赋值:parser.add_argument("a",help="输出a值")
    执行位置参的赋值,对应命令行输入为:python detect.py 1,最后输出args.a = 1
  • 可选赋值:parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path or triton URL')
    可选参数可选可不选
参数大致情况
action程序运行前的操作。结合可选参数bool(python detect.py --bool,默认action为store_true,则将其bool设置为1 )
nargs接受的参数个数
count参数出现的次数。结合action,比如 action="count"
desault参数默认值
type默认值为str,不是str值会被过滤。需要int类型,只需设置type = int
choices参数可选值,比如choices=[0, 1, 2]
required指定参数需要用到该值,比如required=True)
help参数介绍
metavar配合help将其信息输出
dest关联值,若dest=“a”,那么可以通过args.a访问该参数
version程序版本信息

其源函数的逻辑代码如下(在argparse模块中,仅展示大致逻辑):
关于函数中涉及的*args, **kwargs,可看我这篇文章:Python关于 *args 和 **kwargs 参数的详解(全)

    # =======================# Adding argument actions# =======================def add_argument(self, *args, **kwargs):"""add_argument(dest, ..., name=value, ...)add_argument(option_string, option_string, ..., name=value, ...)"""# 如果没有提供位置参数,或者只提供了一个,而且它看起来不像选项字符串,解析一个位置参数chars = self.prefix_charsif not args or len(args) == 1 and args[0][0] not in chars:if args and 'dest' in kwargs:raise ValueError('dest supplied twice for positional argument')kwargs = self._get_positional_kwargs(*args, **kwargs)# 否则,我们将添加一个可选参数else:kwargs = self._get_optional_kwargs(*args, **kwargs)# 如果没有提供默认值,则使用解析器级别的默认值if 'default' not in kwargs:dest = kwargs['dest']if dest in self._defaults:kwargs['default'] = self._defaults[dest]elif self.argument_default is not None:kwargs['default'] = self.argument_default# 创建操作对象,并将其添加到解析器中action_class = self._pop_action_class(kwargs)if not callable(action_class):raise ValueError('unknown action "%s"' % (action_class,))action = action_class(**kwargs)# 如果操作类型不可调用,则引发错误type_func = self._registry_get('type', action.type, action.type)if not callable(type_func):raise ValueError('%r is not callable' % (type_func,))if type_func is FileType:raise ValueError('%r is a FileType class object, instance of it'' must be passed' % (type_func,))# 如果元数据与类型不匹配,则引发错误if hasattr(self, "_get_formatter"):try:self._get_formatter()._format_args(action, None)except TypeError:raise ValueError("length of metavar tuple does not match nargs")return self._add_action(action)# =======================# 对应函数代码调用# =======================def add_argument_group(self, *args, **kwargs):group = _ArgumentGroup(self, *args, **kwargs)self._action_groups.append(group)return groupdef add_mutually_exclusive_group(self, **kwargs):## 省略# =======================# 对应参数的赋值 初始化等# =======================class _ArgumentGroup(_ActionsContainer):def __init__(self, container, title=None, description=None, **kwargs):# 通过检查容器添加任何缺少的关键字参数update = kwargs.setdefaultupdate('conflict_handler', container.conflict_handler)update('prefix_chars', container.prefix_chars)update('argument_default', container.argument_default)super_init = super(_ArgumentGroup, self).__init__super_init(description=description, **kwargs)# 属性self.title = titleself._group_actions = []# 与容器共享大部分属性self._registries = container._registriesself._actions = container._actionsself._option_string_actions = container._option_string_actionsself._defaults = container._defaultsself._has_negative_number_optionals = \

2. 基本用法

  • 执行脚本,输出想要的值:python test1.py 2,最后输出值为4
import argparse
parser = argparse.ArgumentParser(description=" 输出平方数")
parser.add_argument("square",type=int)
args = parser.parse_args()
# 输出args.square的值为4
print args.square**2
  • 执行位置参数(将值赋值给参数):python test1.py 2,最后输出2
import argparse
parser = argparse.ArgumentParser(description=" 输出a值")
parser.add_argument("a")
args = parser.parse_args()
# 输出a的值2
print args.a

3. 实战讲解

以下运行的是yolov5的代码逻辑:

整体的主函数为:

if __name__ == "__main__":# 解析命令行格式下的参数opt = parse_opt()# 调用主函数main(opt)

对应命令行格式下的参数可以为图片或者视频流:python detect.py --source data/images/bus.jpg,代码运行截图如下:
在这里插入图片描述

具体解析参数的函数如下:

def parse_opt():# 传入的参数,以上的参数为命令行赋值的参数,如果没有给定该参数值,会有一个default的默认值进行赋值parser = argparse.ArgumentParser()parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path or triton URL')parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob/screen/0(webcam)')parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='(optional) dataset.yaml path')parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')# 省略的参数(由于参数比较多,此处就不放入opt = parser.parse_args()# 此处对传入的size加以判断。如果不传入,默认为640,则长度为1,则对应size 为640 * 640。如果传入的参数为640 * 640 ,则不修改opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expand# 将其所有的参数信息进行打印print_args(vars(opt)# 将其opt的参数返回,后续调用main函数需要调用该参数return opt

具体main函数的执行如下:

def main(opt):# 检查requirement的依赖包 有无成功安装,如果没有安装部分会在此处报错check_requirements(exclude=('tensorboard', 'thop'))# 如果成功安装,将其所有的参数代入,并执行此处的run函数run(**vars(opt))

http://chatgpt.dhexx.cn/article/nugiTWbD.shtml

相关文章

java打印args的内容_解决java main函数中的args数组传值问题

这几天面试中有遇到关于main数组中的args数组传值的问题,一般是从命令提示符中传值,也可以直接在java代码中赋值。 而且这个数组的长度是动态的,根据传值的个数确定数组的长度。 1.从命令提示符中传值 我在桌面新建了一个文本文档重命名为testmain.java,代码如下 public cl…

k8s args和command

首先先看一下busybox.yaml apiVersion: apps/v1 kind: Deployment metadata:name: app spec:replicas: 2template:metadata:labels:name: appspec:containers:- name: appimage: busybox:1.28.4 #内置的linux大多数命令,多用于测试args:- /bin/sh- -c- slee…

java args的用法_Java中args参数数组的用法说明

main方法args参数用于接收用户输入的参数,参数以字符串形式存放在数组中。 这里将传递参数参数的形式分两种,一种是传递普通参数,另一种是传递含有空格的参数。 1、传递普通参数 public class Test { public static void main(String[] args)…

java args什么意思_java中args是什么意思?

在java中,args是arguments的缩写,是指字符串变量名,属于引用变量,名字代号而已,只是一个默认名,可以自己取的,一般都习惯性照写。String[] args是main函数的形式参数,可以用来获取命…

python args函数_Python函数参数*args 和**kwargs的用法

args就是所有参数的数组,kwargs就是当你传入keyvalue是存储的字典,当函数的参数不确定时,可以使用*args 和kwargs,*args 没有key值,kwargs有key值 def fun_var_args(farg, *args): print "arg:", farg for v…

java args用法_Java中args参数数组的用法说明代码

本篇文章小编给大家分享一下Java中args参数数组的用法说明代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。 main方法args参数用于接收用户输入的参数,参数以字符串…

C语言关键字浅析-return

### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### return关键字是C程序中最常见的关键字之一 对于一个最简单的demo程序,或者说你最早接触的HELLO WORLD程序,里面至少有两个你最早见到的关键字 int和return(注意,inclu…

C语言关键字之inline

简介 inline放在函数返回类型前修饰函数,被修饰的函数就叫做内联函数。 static inline void function(void)在C语言中,函数调用时保存现场,函数中变量的使用等都会占用栈空间。而且进入函数前的保存现场,…

C语言关键字详解(五)带你全面了解 volatile 关键字

目录 一、前言二、最易变的关键字—volatile1、volatile 总体阐述2、CPU运算与内存覆盖3、线程与执行流4、volatile修饰变量 三、总结 一、前言 大家好,欢迎来到C语言深度解析专栏—C语言关键字详解第五篇,在本篇中我们将会介绍C语言当中的另外一个重要的…

c语言关键字之auto

文章目录 1.c语言中,关键字auto用于声明一个变量为自动变量2.c语言中,只使用auto修饰变量,变量的类型默认为整型3.c中,关键字auto是一个类型说明符题目:编写一段程序,读入一段包含标点符号和空格的字符串&a…

C语言深度解剖——C语言关键字

每天进步一点点,坚持带来大改变!!! 前言: 在C语言的学习过程中会遇到许多的关键字,我们是否真的详细了解这些关键字的使用方法和使用场景,下面我们来详解C语言中的32个关键字 1.C语言关键字概览…

c语言标识符与关键字的关系,C语言关键字与标识符

没有人有资格干涉你的梦想,同样的,也没有人有义务支持你的梦想。能让你坚持或放弃的,终究只有你自己。 标识符 只能以数字,字母和下划线组成,但第一个不能以数字开头。用户自己使用一般第一个也不用下划线(当然也不会出…

c语言什么是关键字,c语言关键字是什么

c语言关键字是什么? c语言关键字又称为保留字,就是已被C语言本身使用,不能作其它用途使用的字。 C语言简洁、紧凑,使用方便、灵活。ANSI C标准C语言共有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语…

C语言的32个基本关键字

1、数据类型关键字(12个) (1) char :声明字符型变量或函数 注:char 占一个字节,也就是 8 个二进制位,但它表示的是有符号的类型,所以表示的范围是 -128~127 ;uchar 表示无符号的类型…

C语言的32个常用关键字

目录 前言 一、关键字是什么? 二、关键字使用方法 1.关键字分类 2.使用方法(详解) 1.数据类型关键字 int,float,double,charshort,long,signed,unsignedunion&#x…

C语言32个关键字详解

以下内容建议大家收藏,全是干货,建议反复观看!!! Lets Go ! ! ! 首先我们把 C89(C90) 的所有关键字进行一下分类,方便大家理解。 数据类型关键字(12个): char、short、int、long、signed、unsi…

android将手机能当蓝牙耳机使用吗,一种利用android手机作为蓝牙适配器的蓝牙耳机测试系统及其测试方法与流程...

本发明涉及蓝牙耳机测试的技术领域,特别涉及一种利用android手机作为蓝牙适配器的蓝牙耳机测试系统及其测试方法。 背景技术: 目前蓝牙耳机测试采用如下技术方案: 1、开发蓝牙适配器: 从耳机厂商处获取配置信息,根据配置信息开发蓝牙dongle(蓝牙适配器); 2.测试蓝牙耳机:…

手机音频口通信

1. 为什么用音频口通信而不用其他接口? 原因是音频口简单、廉价、每个智能手机上都有而且有大量的资料可供查阅。其他的接口诸如usb,firewire等,有的只是安卓手机上有,有的只是iPhone手机上有,即使是一般安卓手机上…

软件测试教程之手机软件测试方法

第一:兼容性测试(转载来源:千锋) 针对App通常会考虑这些方面: 1)操作系统版本 包括Andoird版本,iOS版本 2)屏幕分辨率 android 800*480, 960*640,1280*720(720p),1920*1080(1080p),2560*1440(2k). 对于iOS,…

手机语音通讯测试(Mobile Phone Communication Test)

手机作为个人电子设备,已然成为人们日常生活的中心,其语音通讯质量的好坏直接影响客户黏性。许多标准化组织和运营商对手机的通话质量有详细客观的定义,如中国移动,美国T-Mobile均对手机入网有严格的要求,包括手机通话的延时,及在有一定网络损耗下的语音通话质量等等。 手…