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

news2025/1/25 1:44:35

文章目录

  • 引言
  • 命令行参数解析原理
  • 命令行参数概述
  • 使用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.coloradmin.cn/o/1329921.html

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

相关文章

【稳定检索|投稿优惠】2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024)

2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024) 2024 International Conference on Green Energy and Grid Power Systems(ICGEGPS) 一、【会议简介】 2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024)将在宜宾盛大召开。本次会议将聚焦绿色能源与电网电力系统的最新…

Linux——缓冲区

我在上篇博客留下了一个问题,那个问题就是关于缓冲区的问题,我们发现 文件有缓冲区,语言有用户级缓冲区,那么缓冲区到底是什么?,或者该怎 么认识缓冲区?这篇文章或许会让你有所认识,…

单例模式的基本用法

单例模式是众多设计模式中的一种,那说到设计模式,我们要想知道什么是设计模式? 设计模式就是一套反复使用、多数人知晓的、经过分类、代码设计经验总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解,保证代码的可靠性。毫无疑问…

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle WebLogic Server 10.3.6.0.0/12.1.3.0.3/2.2.1/1.10/12.2.1.1/22.0(Application …

Pipelined-ADC设计二——结构指标及非理想因素(Part1)

本章将详细介绍电路各个模块的设计思路和设计中需要注意的关键点,给出流水线ADC中的非理想因素,并计算出流水线ADC各个模块具体指标。根据电路中信号的传输方向,依次介绍采样保持电路、Sub_ADC,MDAC 等模块的设计。(本…

【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南

前言 本文为大家带来的是 OpenEthan 开发的 SMSBoom 项目 —— 一种用于短信服务测试的工具。这个工具能够发送大量短信,通常用于测试短信服务的稳定性和处理能力。在合法和道德的范畴内,SMSBoom 可以作为一种有效的测试工具,帮助开发者和系统…

关于redis单线程和IO多路复用的理解

首先,Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻,对于Redis整体而言肯定不是只有一个线程。 我们常说的Redis 是单线程,主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的,这也是 Redis 对外提供键值存储…

【ARMv8M Cortex-M33 系列 1 -- SAU 介绍】

文章目录 Cortex-M33 SAU 介绍SAU 的主要功能包括SAU 寄存器配置示例 Cortex-M33 SAU 介绍 在 ARMv8-M 架构中,SAU(Security Attribution Unit)是安全属性单元,用于配置和管理内存区域的安全属性。SAU 是 ARM TrustZone 技术的一…

论文阅读——Flamingo

Flamingo: a Visual Language Model for Few-Shot Learning 模型建模了给定交织的图片或支视频的条件下文本y的最大似然: 1 Visual processing and the Perceiver Resampler Vision Encoder:from pixels to features。 预训练并且冻结的NFNet&#xff…

kindeditor The method toJSONString() is undefined for the type JSONObject

kindeditor 插件上传文件出错的 json_simple-1.1.jar 也不知道是多老的项目,多老的包了,稀有东西

助力智能人群检测计数,基于DETR(DEtectionTRansformer)开发构建通用场景下人群检测计数识别系统

在一些人流量比较大的场合,或者是一些特殊时刻、时段、节假日等特殊时期下,密切关注当前系统所承载的人流量是十分必要的,对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段,本文的主要目的是想要…

Liteos移植_STM32_HAL库

0 开发环境 STM32CubeMX(HAL库)keil 5正点原子探索者STM32F4ZET6LiteOS-develop分支 1 STM32CubeMX创建工程 如果有自己的工程,直接从LiteOS源码获取开始 关于STM32CubeMX的安装,看我另一篇博客STM32CubeMX安装 工程配置 创建新工程 选择芯片【STM32F…

C++:第九讲前缀和与差分

Everyday English Your optimal career is simply this: Share the real you with physical world through th e process of creative self-expression. 你的最佳职业很简单,就是这样:通过创造性自我表达的途径和世界分享真实的你。 前言 这节课带你们…

Codeforces Round 862 (Div. 2)

Problem - A - Codeforces AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; const int N1e310; int a[N]; int n; void solve() {cin>>n;int ans0;for(int i1;i<n;i) cin>>a[i],ans^a[i];if(n%21){for(in…

3.[BUUCTF HCTF 2018]WarmUp1

1.看题目提示分析题目内容 盲猜一波~ &#xff1a; 是关于PHP代码审计的 2.打开链接&#xff0c;分析题目 给你提示了我们访问source.php来看一下 大boss出现&#xff0c;开始详细手撕~ 3.手撕PHP代码&#xff08;代码审计&#xff09; 本人是小白&#xff0c;所以第一步&…

Linux Centos-7.5_64bit 等保测评

一、新增用户 新增test用户 useradd test 设置密码 passwd 修改test的密码 passwd test 修改/etc/sudoers文件&#xff0c;找到下面一行&#xff0c; /etc/sudoers test ALL(ALL) ALL 保存是出现 E45: readonly option is set (add ! to override) 解决办法&#xff…

arduino舵机练习

接地线gnd和电源线5v&#xff1b;信号线链接任意数字针脚 // C code // #include <Servo.h> //引入舵机库Servo servo_2; //定义舵机void setup() {servo_2.attach(2, 500, 2500);/* servo_2.attach(2, 500, 2500) servo_2 对象的一个方法调用&#xff0c;其中包含…

【Amazon 实验①】使用Amazon WAF做基础 Web Service 防护

文章目录 一、实验介绍二、实验环境准备三、验证实验环境四、Web ACLs 配置 & AWS 托管规则4.1 Web ACLs 介绍4.2 Managed Rules 托管规则4.3 防护常见威胁类型&#xff08;sql注入&#xff0c;XSS&#xff09;4.4 实验步骤4.4.1 创建Web ACL4.4.2 测试用例4.4.3 测试结果4…

【Spring实战】配置多数据源

文章目录 1. 配置数据源信息2. 创建第一个数据源3. 创建第二个数据源4. 创建启动类及查询方法5. 启动服务6. 创建表及做数据7. 查询验证8. 详细代码总结 通过上一节的介绍&#xff0c;我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中&#xff0c;…

Linux的/proc/self/学习

文章目录 /proc目录/proc/self的使用 在做SSTI模板注入的CTF题中&#xff0c;发现有师傅提到可以用/proc/self这个目录获取flag&#xff0c;所以也来学习一波主要参考. (我才知道&#x1f601;&#x1f601;&#x1f601;)可以通过/proc/$pid/来获取指定进程的信息&#xff0c…