Python命令行参数解析:原理、技巧与实践

文章目录

  • 引言
  • 命令行参数解析原理
  • 命令行参数概述
  • 使用argparse模块解析命令行参数
    • 1. 创建ArgumentParser对象
    • 2. 添加命令行参数
    • 3. 解析命令行参数
    • 4. 可选参数`action`
    • 5. 参数的类型转换
  • 实践示例
  • 总结
  • 结束语

引言

在Python中,命令行参数解析是一个重要的主题,它允许我们编写灵活且可配置的脚本。本文将深入探讨Python命令行参数的原理、技巧与实践,帮助您更好地理解和应用这一功能。

命令行参数解析原理

命令行参数概述

命令行参数是指在运行Python脚本时传递给脚本的字符串。这些字符串可以通过Python代码进行解析和处理,以实现不同的功能。常见的命令行参数包括位置参数可选参数关键字参数等。

使用argparse模块解析命令行参数

Python提供了多种方式来解析命令行参数,包括sys.argvargparse模块和getopt模块等。其中,argparse模块是最常用和最强大的命令行参数解析库。

1. 创建ArgumentParser对象

首先,需要创建一个ArgumentParser对象,该对象将用于定义命令行参数的规则和行为。可以通过调用ArgumentParser类的构造函数来创建对象,如下所示:

import argparse
parser = argparse.ArgumentParser()

2. 添加命令行参数

使用add_argument()方法添加命令行参数。以下是用表格直观展示add_argument()可选参数(optional arguments)、位置参数(positional arguments)和关键词参数(keyword arguments)的区别:

参数类型说明示例
可选参数(Optional Arguments)可选参数通常使用短选项(如-a)或长选项(如--arg)进行指定。可选参数在add_argument()方法中使用参数名进行定义,并通过dest参数指定存储结果的属性名。parser.add_argument('-a', '--arg', dest='arg', help='This is an optional argument')
位置参数(Positional Arguments)位置参数没有选项标志,按照它们在命令行中出现的顺序进行解析。在add_argument()方法中只需指定参数名即可。parser.add_argument('posarg', help='This is a positional argument')
关键词参数(Keyword Arguments)关键词参数在命令行中使用arg=value的语法进行指定。关键词参数在add_argument()方法中使用参数名进行定义,并通过default参数指定默认值。parser.add_argument('--kwarg', default=None, help='This is a keyword argument')

总结:

  • 可选参数通过短选项或长选项进行指定,使用dest参数指定存储结果的属性名。
  • 位置参数按照它们在命令行中出现的顺序进行解析,没有选项标志。
  • 关键词参数允许用户通过arg=value的方式来提供参数,使用default参数指定默认值。

示例代码:

# demo_arg.py
import argparse
parser = argparse.ArgumentParser()# 可选参数   长选项 --batch_size | 短选项 -b  | 属性名 BATCH_SIZE
parser.add_argument('--batch_size', "-b", dest="BATCH_SIZE", type=int, help='An integer parameter') # 位置参数  没有选项标志,只需指定参数名 data_root
parser.add_argument('data_root', type=str, help='A positional parameter')# 关键词参数  使用参数名进行定义,并通过default参数指定默认值。
parser.add_argument('--dataset', default="Mnist", help='A keyword argument')print(parser.parse_args())

在命令行中,执行语句:

python demo_arg.py -b=2  --dataset=ImageNet /project/dataset

运行结果:
在这里插入图片描述

在上面的示例中,我们在命令行通过短选项-b为可选参数batch_size传递命令行参数,并指定BATCH_SIZE作为可选参数在命名空间的属性名;我们在命令行通过--arg=value的形式为关键词参数dataset传递命令行参数;通过命令行参数的位置顺序,为位置参数data_root传递命令行参数。

3. 解析命令行参数

使用parse_args()方法解析命令行参数。该方法将返回一个命名空间对象,其中包含了所有传递给脚本的参数值。例如:

args = parser.parse_args()
print(args.BATCH_SIZE)  # 输出传递给BATCH_SIZE的参数值
print(args.data_root)  # 输出传递给data_root的参数值
print(args.dataset) # 输出传递给dataset的参数值

运行结果:

在这里插入图片描述

4. 可选参数action

argparse模块中的add_argument()方法有一个可选参数action,它用于指定当命令行参数被解析时应该执行的操作。action参数常见的值有2种:

  1. 'store'(默认值):将参数值存储在目标对象中。
  2. 'store_true''store_false':将布尔值True或False存储在目标对象中,而不是参数值。如果命令行参数存在,则存储True,否则存储False。

下面是使用action参数的示例:

import argparse
parser = argparse.ArgumentParser()parser.add_argument('--batch_size', "-b", dest="BATCH_SIZE", type=int, help='An integer parameter')
parser.add_argument('data_root', type=str, help='A positional parameter')
parser.add_argument('--dataset', default="Mnist", help='A keyword argument')
parser.add_argument('--option1', action='store_true', help='Option 1')
parser.add_argument('--option2', action='store_false', help='Option 2')args = parser.parse_args()

当命令行指令同时不指定option1和option2时,运行结果如下所示:
在这里插入图片描述
当命令行指令同时指定option1和option2时,运行结果如下所示:
在这里插入图片描述

可以看到,option1默认为False,一旦命令行指定,option1为True;option2默认为True,一旦命令行指定,option1为False;

5. 参数的类型转换

使用type参数可以为命令行参数设置类型转换函数。例如:

parser.add_argument('--lr', type=float, help='A float parameter')

在上面的示例中,–lr参数将使用**float()**函数进行类型转换。

实践示例

下面是一个示例脚本,演示了如何使用argparse模块解析命令行参数并打印:

import argparse
parser = argparse.ArgumentParser()parser.add_argument('--batch_size', "-b", dest="BATCH_SIZE", type=int, help='An integer parameter')
parser.add_argument('data_root', type=str, help='A positional parameter')
parser.add_argument('--dataset', default="Mnist", help='A keyword argument')
parser.add_argument('--option1', action='store_true', help='Option 1')
parser.add_argument('--option2', action='store_false', help='Option 2')args = parser.parse_args()args = vars(args)  # vars python的内置方法
# 从下面的用法看起来vars方法是把opt搞成字典类型啦
print('------------ Options -------------')
for k, v in sorted(args.items()):print('%s: %s' % (str(k), str(v)))
print('-------------- End ----------------')

命令行指令:

python demo_arg.py -b=2  --dataset=ImageNet /project/dataset --option1 --option2 

运行结果:
在这里插入图片描述

总结

通过argparse模块,我们可以轻松地解析命令行参数,实现灵活且可配置的脚本。本文详细介绍了argparse模块的原理、技巧和实践,希望能够帮助您更好地理解和应用这一功能。

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

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

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

相关文章

DshanMCU-R128s2 SDK 架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC,同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文档作为 R128 FreeRTOS SDK 开发指南,旨在帮助软件开发工程师、技术支持工程师快速上手&am…

【原理图专题】如何使用OrCAD Capture鱼眼视图

在原理图设计时,有时一张图纸下有很多的电路。但是我们查看时只关注一部分,是不是要使用放大功能直接进行放大呢? 其实还可以使用鱼眼视图功能来相应的查看。 如下所示为原始视图:可以看到一些器件名称、网络标号等已经看不清了。如果正常我们要查看部分视图,这时通用的…

【【C++11特性篇】【强制/禁止 】生成默认函数的关键字default&delete(代码演示)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Linux》…

Kubernetes 的用法和解析(K8S 日志方案) -- 8

一、统一日志管理的整体方案 通过应用和系统日志可以了解Kubernetes集群内所发生的事情,对于调试问题和监视集群活动来说日志非常有用。对于大部分的应用来说,都会具有某种日志机制。因此,大多数容器引擎同样被设计成支持某种日志机制。 对…

XML简介 (EXtensible Markup Language)

XML简介 (EXtensible Markup Language) 可扩展标记语言 特点 XML与操作系统、编程语言的开发平台无关实现不同系统之间的数据交换 作用 数据交互配置应用程序和网站Ajax基石 XML标签 XML文档内容由一系列标签元素组成 <元素名 属性名"属性值">元素内容&l…

SpringCloud Alibaba(itheima)

SpringCloud Alibaba 第一章 微服务介绍1.1系统架构演变1.1.1单体应用架构1.1.2垂直应用架构1.1.3分布式架构1.1.4 SOA架构1.1.5微服务架构 1.2微服务架构介绍1.2.1微服务架构的常见问题1.2.2微服务架构的常见概念1.2.3微服务架构的常见解决方案 1.3 SpringCloud Alibaba介绍1.…

[Linux] Haproxy负载均衡集群

一、Haproxy知识 1.1 常用的负载均衡调度器 软件通常使用开源的LVS、Haproxy、 Nginx LVS性能最好&#xff0c;但是搭建相对复杂&#xff1b;Nginx 的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xff0c;高并发性能没有Haproxy好。 硬件一般使用…

Android Matrix画布Canvas缩放scale,Kotlin

Android Matrix画布Canvas缩放scale&#xff0c;Kotlin val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.ARGB_8888)val canva…

CSS-SVG-环形进度条

线上代码地址 <div class"circular-progress-bar"><svg><circle class"circle-bg" /><circle class"circle-progress" style"stroke-dasharray: calc(2 * 3.1415 * var(--r) * (var(--percent) / 100)), 1000" …

linux系统和网络(二):进程和系统时间

本文主要探讨linux系统进程和系统相关知识&#xff0c;本博客其他博文对该文章的部分内容有详细介绍 main函数 int main(int argc,char *argv[],char *envp[]); 操作系统下main执行前先执行引导代码,编译连接引导代码和程序连接在一起构成可执行程序,加载器将程序加载到内存中…

离散型制造企业为什么要注重MES管理系统的实施

离散型制造企业经常面临三个核心问题&#xff1a;生产什么、生产多少以及如何生产。尽管许多企业都实施了ERP系统&#xff0c;但仍然绕不开MES管理系统的话题。本文将从三个方面详细解释为什么离散型企业需要实施MES管理系统。 一、生产线经常出现的问题 在离散型企业中&#…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)

在这篇文章中虽然实现了能够和多客户端建立连接&#xff0c;并且同时和多个客户端进行通信。 基于多反应堆的高并发服务器【C/C/Reactor】&#xff08;上&#xff09;-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135141316?spm1001.2014.3001.5501但是有…