【Python程序开发系列】一文搞懂argparse模块的常见用法(案例+源码)

一、引言

       argsparse是python的命令行解析的标准模块,内置于python,不需要安装。这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行。

       在运行深度学习程序时。往往会因为电脑配置不行导致程序运行慢卡,需要将程序在虚机上进行测试代码,而虚机一般没有IDE,只能用命令行来测试代码。

       使用argparse模块,你可以定义程序所需的命令行参数和选项,以及它们的类型、默认值、帮助信息等。然后,argparse会解析用户提供的命令行输入,并将其转换为易于使用的Python对象。

二、实现过程

案例

假如我有一个名为20231225.py的Python脚本如下:

import argparse# 创建一个ArgumentParser对象
parser = argparse.ArgumentParser(description='这是一个命令行参数解析的示例程序')
# 添加一个位置参数
parser.add_argument('name', type=str, help='你的名字')
# 添加一个可选参数
parser.add_argument('--age', type=int, default=18, help='你的年龄')
# 解析命令行输入
args = parser.parse_args()
# 打印解析的参数(执行任务)
print('你好,{}!你的年龄是{}'.format(args.name, args.age))

2.1 创建一个ArgumentParser对象

parser = argparse.ArgumentParser(description='这是一个命令行参数解析的示例程序')

创建了一个ArgumentParser对象,并提供了一个描述性的字符串作为参数。

2.2 添加一个位置参数

parser.add_argument('name', type=str, help='你的名字')

在命令行中传入参数时候,如果采用了位置参数,传入的参数的先后顺序不同,运行结果往往会不同,这是name是位置参数。

2.3 添加一个可选参数

parser.add_argument('--age', type=int, default=18, help='你的年龄')

为了在命令行中避免上述位置参数的bug(容易忘了顺序),可以使用可选参数,这个有点像关键词传参,但是需要在关键词前面加--,这里age的关键词传参。

add_argument方法的常用参数如下:name:参数的名称或选项的名称,可以是位置参数(不带前缀)或可选参数(带前缀)。
type:参数的类型。可以是内置类型(如int、float、str等),也可以是自定义类型或函数。
default:参数的默认值。如果用户没有提供该参数,则使用默认值。
help:参数的帮助信息。当用户使用-h或--help选项时,将显示该帮助信息。
required:指定参数是否为必需参数。默认为False,即可选参数。
choices:参数的可选值列表。用户提供的参数必须是该列表中的一个值。
nargs:参数的数量。可以是具体的数字(如1表示一个参数,2表示两个参数),也可以是特殊值(如'+'表示一个或多个参数,'*'表示零个或多个参数)。
action:指定参数的动作。常用的动作包括存储参数值、计数参数出现的次数、将参数值存储为列表等。

2.4 解析命令行输入

args = parser.parse_args()

使用parse_args方法解析命令行输入,并将解析的结果存储在args变量中

2.5 执行任务

print('你好,{}!你的年龄是{}'.format(args.name, args.age))

利用解析出的变量进行任务操作:

图片

总结

        在实际的应用过程,一般会将创建ArgumentParser对象、添加参数、解析参数过程写在一个函数中,将任务写在一个函数,如下:

import argparsedef parseArgs():# 创建一个ArgumentParser对象parser = argparse.ArgumentParser(description='这是一个命令行参数解析的示例程序')# 添加一个位置参数parser.add_argument('name', type=str, help='你的名字')# 添加一个可选参数parser.add_argument('--age', '-a', type=int, default=18, help='你的年龄')# 解析命令行输入args = parser.parse_args()return argsdef task(name, age):print('你好,{}!你的年龄是{}'.format(name, age))def main():args = parseArgs()task(args.name, args.age)if __name__  == '__main__':main()

        这里-a是短选项(short option)的表示方式。短选项通常由单个字符组成,前面加上一个短横线(减号)作为前缀。短选项用于提供命令行参数的简短表示方式,相比于完整的长选项(long option),它们更加紧凑和方便。例如,使用短选项时,可以将--age表示为-a。运行:

图片

三、机器学习/深度学习的应用场景

        argparse库在机器学习或深度学习项目中非常有用,可以提供灵活的命令行参数解析和配置选项,使得程序更易于使用和扩展。通过使用argparse,可以将程序的配置和参数交给用户,使得用户可以通过命令行来控制程序的行为,而不需要修改源代码。以下是一些在这类项目中使用argparse的常见情况:

设置模型超参数(Hyperparameters):机器学习和深度学习模型通常有许多超参数,如学习率、批大小、隐藏层大小等。使用argparse可以允许用户在命令行中指定这些超参数的值,而不需要修改源代码。例如,可以通过命令行参数来指定学习率、迭代次数等。

选择数据集和数据预处理选项: 在机器学习项目中,经常需要从多个数据集中选择一个进行训练和测试。使用argparse可以让用户在命令行中指定数据集的路径或名称。此外,还可以提供数据预处理选项,如图像大小、数据增强方法等,以便在命令行中进行灵活配置。

选择模型架构和损失函数: 在深度学习项目中,可以使用argparse来允许用户选择不同的模型架构和损失函数。通过命令行参数,用户可以指定使用的网络模型(如CNN、RNN、Transformer等)以及损失函数的类型(如交叉熵、均方误差等)。

控制训练和评估过程: 使用argparse可以提供命令行参数来控制训练和评估过程的行为。例如,可以指定训练时是否启用 GPU 加速、是否保存模型权重、是否进行交叉验证等。这样用户可以根据实际需求在命令行中灵活配置程序的行为。

四、机器学习/深度学习的应用例子

        假设你正在开发一个图像分类器,使用卷积神经网络(CNN)进行训练和预测。你希望用户能够通过命令行指定一些参数,例如数据集路径、模型超参数和训练配置等。下面是一个简化的例子:

import argparsedef train_model(dataset_path, num_epochs, learning_rate):# 在这里实现训练模型的逻辑passdef parseArgs():# 创建 ArgumentParser 对象parser = argparse.ArgumentParser(description='Image Classifier')# 添加命令行参数parser.add_argument('--dataset', '-d', type=str, required=True, help='Path to the dataset')parser.add_argument('--epochs', '-e', type=int, default=10, help='Number of epochs')parser.add_argument('--learning-rate', '-lr', type=float, default=0.001, help='Learning rate')# 解析命令行输入args = parser.parse_args()return argsdef main():# 解析命令行参数args = parseArgs()# 调用训练函数,并传入命令行参数train_model(args.dataset, args.epochs, args.learning_rate)if __name__ == '__main__':main()

        在上面的例子中,我们使用argparse创建了一个ArgumentParser对象,并添加了三个命令行参数:--dataset、--epochs和--learning-rate。其中,--dataset是必需的参数,而--epochs和--learning-rate是可选参数,并且具有默认值。我们还为每个参数提供了简短的选项,如-d、-e和-lr。用户可以通过命令行来运行这个脚本,并指定数据集路径、训练轮数和学习率等参数。例如:

python image_classifier.py --dataset data/ --epochs 20 --learning-rate 0.01

        通过这种方式,用户可以在不修改源代码的情况下,通过命令行灵活地配置图像分类器的训练过程。

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/633138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dubbo使用详解

简介 Dubbo是一个高性能、轻量级的开源Java RPC框架,由阿里巴巴公司开发并开源。它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。Dubbo使得应用可通过高性能的 RPC 实现服务的输出和输…

浅聊雷池社区版(WAF)的tengine

雷池社区版是一个开源的免费Web应用防火墙(WAF),专为保护Web应用免受各种网络攻击而设计。基于强大的Tengine,雷池社区版提供了一系列先进的安全功能,适用于中小企业和个人用户。 Tengine的故事始于2011年,…

解析Transformer模型

原文地址:https://zhanghan.xyz/posts/17281/ 进入Transformer RNN很难处理冗长的文本序列,且很容易受到所谓梯度消失/爆炸的问题。RNN是按顺序处理单词的,所以很难并行化。 用一句话总结Transformer:当一个扩展性极佳的模型和一…

springcloud Client端cloud-consumer-order80

文章目录 简介建立module修改pom修改yml主启动类把公共代码写在一个mudule 里面测试 简介 这个是和之前的8001相互配合端口测试 这里的80的用户测试端口。 代码在:GitHub 上:https://github.com/13thm/study_springcloud/tree/main/days2 建立module …

完美解决idea一直indexing,无法操作的问题

今天主要分享一下在使用idea 2020.3版本开发maven项目的时候,一直出现有效件index, 有时候是scaning indexing, 有时候是update indexing, indexing的时候,idea基本上就没办法操作了,连跳入到类或方法里都跳不了。不厌其烦。 于是…

模型Model:字符串列表模型QStringListModel

一、QStringListModel (1)功能:处理字符串列表的数据模型,可作为QListView的数据模型,在界面上显示和编辑字符串列表。 二、QStringListModel 类中的函数 1)、 QStringListModel(QObject *parent Q_NULLPTR) //构造函…

工程监测仪器振弦采集仪的新技术研究与创新方面

工程监测仪器振弦采集仪的新技术研究与创新方面 工程监测仪器振弦采集仪是一种用于测量和监测工程结构振动特性的仪器。传统的振弦采集仪主要采用振弦传感器和数据采集设备,通过对结构振动信号的采集和分析,可以获得结构的动态特性,如固有频…

【01】mapbox js api加载arcgis切片服务

需求: 第三方的mapbox js api加载arcgis切片服务,同时叠加在天地图上,天地图坐标系web墨卡托。 效果图: 形如这种地址去加载http://zjq2022.gis.com:8080/demo/loadmapboxtdt.html 思路: 需要制作一个和天地图比例…

vscode配置web开发环境(WampServer)

这里直接去下载了集成的服务器组件wampserver,集成了php,MySQL,Apache 可能会出现安装问题,这里说只有图上这些VC包都安装了才能继续安装,进入报错里提供的链接 在页面内搜索相关信息 github上不去可以去镜像站 下载…

《Python数据分析技术栈》第01章 02 Jupyter入门(Getting started with Jupyter notebooks)

02 Jupyter入门(Getting started with Jupyter notebooks) 《Python数据分析技术栈》第01章 02 Jupyter入门(Getting started with Jupyter notebooks) Before we discuss the essentials of Jupyter notebooks, let us discuss…

C#,字符串匹配(模式搜索)RK(Rabin Karp)算法的源代码

M.O.Rabin Rabin-Karp算法,是由M.O.Rabin和R.A.Karp设计实现的一种基于移动散列值的字符串匹配算法。 通常基于散列值的字符串匹配方法:(1)首先计算模式字符串的散列函数;(2)然后利用相同的散…

【漏洞攻击之文件上传条件竞争】

漏洞攻击之文件上传条件竞争 wzsc_文件上传漏洞现象与分析思路编写攻击脚本和重放措施中国蚁剑拿flag wzsc_文件上传 漏洞现象与分析 只有一个upload前端标签元素,并且上传任意文件都会跳转到upload.php页面,判定是一个apache容器,开始扫描…

IntelliJ IDEA 中输出乱码解决

最近tomcat突然在控制台输出乱码,各种乱码问题,查阅大量的资料,最终得以解决. IDEA控制台输出乱码 问题一:idea中tomcat控制台输出乱码 运行本地的tomcat\bin\start.bat文件页面显示正常 在idea中显示乱码 解决: 根…

WebRTC视频会议/视频客服系统EasyRTC进入会议室密码验证的开发与实现

基于WebRTC技术的EasyRTC视频会议系统,建设目标是让用户随时随地、快捷方便地进行视频会议,并根据行业需求有针对性地提供多样化、个性化功能,该系统是覆盖全球的实时音视频开发平台,支持一对一、一对多等视频通话,极大…

梳理从MVP变换到光栅化的过程

1.梳理从MVP变换到光栅化的过程 相关博客: 1.MVP变换 2.Rasterization(光栅化) 1.1 View/Camera transformation 此例中相机初始位置为(0,0,5)【备注:详见主函数中输入的值】经过 M view M_{\text{view}}…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-贴子列表分页显示实现

锋哥原创的SpringbootLayui python222网站实战: python222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火…

使用 ClassFinal 对SpringBoot jar加密加固并进行机器绑定

写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!如果我的博客对你有帮助,欢迎进行评论✏️✏️、点赞👍👍、收藏⭐️⭐️&#…

【正点原子STM32】初识STM32(芯片分类、资料下载、命名规则、选型)

一、STM32是什么 二、STM32芯片分类 三、STM32命名规则 四、STM32选型 五、总结 一、STM32是什么 STM32是STMicroelectronics(意法半导体)公司推出的一系列32位的嵌入式系统微控制器(Microcontroller Unit,MCU)产品。…

网络安全 | 苹果承认 GPU 安全漏洞存在,iPhone 12、M2 MacBook Air 等受影响

1 月 17 日消息,苹果公司确认了近期出现的有关 Apple GPU 存在安全漏洞的报告,并承认 iPhone 12 和 M2 MacBook Air 受影响。 该漏洞可能使攻击者窃取由芯片处理的数据,包括与 ChatGPT 的对话内容等隐私信息。 安全研究人员发现,…

策略模式在工作中的运用

前言 在不同的场景下,执行不同的业务逻辑,在日常工作中是很寻常的事情。比如,订阅系统。在收到阿里云的回调事件、与收到AWS的回调事件,无论是收到的参数,还是执行的逻辑都可能是不同的。为了避免,每次新增…