【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 argparse


def 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 args

def 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 argparse

def train_model(dataset_path, num_epochs, learning_rate):
    # 在这里实现训练模型的逻辑
    pass

def 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 args

def 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、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【React基础】– JSX语法

文章目录 认识JSX为什么React选择了JSXJSX的使用 React事件绑定this的绑定问题事件参数传递 React条件渲染React列表渲染列表中的key JSX的本质createElement源码Babel官网查看直接编写jsx代码 虚拟DOM的创建过程jsx – 虚拟DOM – 真实DOM声明式编程 阶段案例练习 认识JSX ◼ …

手动添加测试用例配置输入参数和期望值

1.选中函数,点击右键选择插入测试用例。这里所选择的插入测试用例区别于之前的测试用例的地方在于,这里插入测试用例是手动配置的,之前的是自动生成的。手动配置可以自定义选择输入参数和期望值。 2.添加测试用例后,点击测试用例&…

高光谱分类论文解读分享之Grid Network: 基于各向异性视角下特征提取的高光谱影像分类

IEEE GRSL 2023:Grid Network: 基于各向异性视角下特征提取的高光谱影像分类 题目 Grid Network: Feature Extraction in Anisotropic Perspective for Hyperspectral Image Classification 作者 Zhonghao Chen , Student Member, IEEE, Danfeng Hong , Senior …

Conmi的正确答案——使用eclipse进行ESP32C3的debug

eclipse IDE 版本:2023-12 1、安装debug环境 参考大神的教程:【图文】手把手教你使用 Eclipse IDE 开发 ESP32 (这里是为了我下次回来速通才写的部分) 1.1、安装插件(plug-in,新的软件已经写成software了): 相关软件参数: 汉化(安装完成会提示重启应用): Name:…

【前后端的那些事】15min快速实现图片上传,预览功能(ElementPlus+Springboot)

文章目录 Element Plus SpringBoot实现图片上传,预览,删除效果展示 1. 后端代码1.1 controller1.2 service 2. 前端代码2.1 路由创建2.2 api接口2.2 文件创建 3. 前端上传组件封装 前言:最近写项目,发现了一些很有意思的功能&…

node.js 实现文件上传 和图片映射 文件下载(multer)

Muter是一个node.js中间件。主要处理multupart/from-data类型的表单数据,常用于上传文件。在express.js应用中,multer使得上传文件变得更加简单。主要功能是将客户端上传的文件存储在服务器的本地文件系统中。它还添加了一个body对象以及file或files对象…

qnx 上screen + egl + opengles 最简实例

文章目录 前言一、qnx 上的窗口系统——screen二、screen + egl + opengles 最简实例1.使用 addvariant 命令创建工程目录2. 添加源码文件3. common.mk 文件4. 编译与执行总结参考资料前言 本文主要介绍如何在QNX 系统上使用egl和opengles 控制GPU渲染一个三角形并显示到屏幕上…

数据结构与算法-二叉树-从前序与中序遍历序列构造二叉树

从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7…

Ubuntu18.04在线镜像仓库配置

在线镜像仓库 1、查操作系统版本 rootubuntu:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 2、原文件备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 3、查…

深入理解Linux文件系统

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:晴る—ヨルシカ 0:20━━━━━━️💟──────── 4:30 🔄 ◀️ ⏸ ▶️ ☰ &…

宋仕强论道之华强北的领军企业(四十六)

华强北曾经的3发展是因为领军企业的带动而蓬勃发展,当年的华强集团、赛格集团、桑达集团和华发集团等是其中的代表,但现在他们失去了曾经的带头大哥的地位。其他的例子,如腾讯对于深圳市南山区科技园的带动,华为对龙岗坂田雪象岗头…

MySQL面试题 | 16.精选MySQL面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Leetcode2207. 字符串中最多数目的子字符串

Every day a Leetcode 题目来源:2207. 字符串中最多数目的子字符串 解法1:贪心 一次遍历 设 pattern 的第一个字符为 x,第二个字符为 y。 根据题意,x 插入的位置越靠左,答案的个数越多;y 插入的位置越…

C#: form 窗体的各种操作

说明:记录 C# form 窗体的各种操作 1. C# form 窗体居中显示 // 获取屏幕的宽度和高度 int screenWidth Screen.PrimaryScreen.Bounds.Width; int screenHeight Screen.PrimaryScreen.Bounds.Height;// 设置窗体的位置 this.StartPosition FormStartPosition.M…

【Android】自定义View onDraw()方法会调用两次

问题 自定义了View后,在构造函数中设置画笔颜色,发现它没起效,但是在onDraw()里设置颜色就会起效,出问题的代码如下: public RoundSeekbarView(Context context, Nullable AttributeSet attrs) {super(context, attrs…

Discuz论坛网站登录账号操作慢,必须强制刷新才会显示登录怎么办?

飞飞发现在登录服务器大本营账号时,输入账号密码登录后还是显示的登录框,强制刷新后才知道已经登录了,每次都要刷新才能正常显示,非常影响用户体验,于是在网上找了类似的问题故障解决方法,目前问题已经解决…

vue安装组件报错In most cases you are behind a proxy or have bad network settings.

解决办法 步骤1 npm config get proxy npm config get https-proxy 如果2个返回值不为null,请执行下面代码,重置为null。否则,直接执行步骤2。 npm config set proxy null npm config set https-proxy null 步骤2 npm config set regis…

MSVS C# Matlab的混合编程系列2 - 构建一个复杂(含多个M文件)的动态库:

前言: 本节我们尝试将一个有很多函数和文件的Matlab算法文件集成到C#的项目里面。 本文缩语: MT = Matlab 问题提出: 1 我们有一个比较复杂的Matlab文件: 这个MATLAB的算法,写了很多的算法函数在其他的M文件里面,这样,前面博客的方法就不够用了。会报错: 解决办法如下…

ceph数据分布式存储

单机存储的问题 存储处理能力不足 传统的IDE的IO值是100次/秒,SATA固态磁盘500次/秒,固态硬盘达到2000-4000次/秒。即使磁盘的IO能力再大数十倍,也不够抗住网站访问高峰期数十万、数百万甚至上亿用户的同时访问,这同时还要受到主机…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(10)-Fiddler如何设置捕获Firefox浏览器的Https会话

1.简介 经过上一篇对Fiddler的配置后,绝大多数的Https的会话,我们可以成功捕获抓取到,但是有些版本的Firefox浏览器仍然是捕获不到其的Https会话,需要我们更进一步的配置才能捕获到会话进行抓包。 2.宏哥环境 1.宏哥的环境是Wi…