Python 超强命令行解析工具 argparse !

news2024/11/15 3:49:11

在工作中,我们经常需要从命令行当中解析出指定的参数,而 Python 也提供了相应的标准库来做这件事情,比如 sys, optparse, getopt, argparse。这里面功能最强大的莫过于 argparse,下面就来看看它用法。

import argparse# 使用 argparse 分为以下几步# 1. 创建命令行解析器对象parse = argparse.ArgumentParser(    description="这是命令行解析器")# 2.给解析器添加命令行参数,可以添加任意个parse.add_argument("-n", dest="name")# 3. 从命令中将参数解析出来args = parse.parse_args()# 然后通过 args 便可以拿到相应的参数值print(args.name)

我们执行一下看看,当前文件叫做 tools.py。

怎么样,是不是很简单呢?所以我们的重点就在 add_argument 方法上面,来看看它都支持哪些参数。

import argparseparse = argparse.ArgumentParser()# 这里出现了 "-n" 和 "--name"# 在命令行中可以通过 '-n 古明地觉' 或者 '--name 古明地觉' 进行指定# 两者的含义是一样的,但 - 后面一般跟短参数,-- 后面跟长参数# 然后是 dest,它表示获取相关参数值时,使用的名称parse.add_argument("-n", "--name", dest="name")# 这里只有一个短参数,那么在命令行中需要通过 -a 来指定parse.add_argument("-a", dest="age")# 这里只有一个长参数,那么在命令行中需要通过 --gender 来指定parse.add_argument("--gender", dest="gender")args = parse.parse_args()print(f"name: {args.name}, age: {args.age}, gender: {args.gender}")

我们来试一下:

还是很简单的,一个 - 后面跟的是短参数,两个 - 后面跟的是长参数。在命令行中通过 - 或者 -- 进行指定,解析完毕之后再通过 dest 参数指定的名字进行获取。

另外,虽然 - 后面跟短参数,-- 后面跟长参数,但我们这样写也是可以的。

parse.add_argument("-name", "--n", dest="name")

只不过这种写法比较怪异,应该写成 --name 和 -n,一个横杠后面是短参数,两个是长参数。

然后这些参数都是可以不指定的,会使用默认值 None。

如果我希望它是必传参数,该怎么办呢?

import argparseparse = argparse.ArgumentParser()parse.add_argument("--host", dest="host", required=True)parse.add_argument("-p", dest="port", default=6379)args = parse.parse_args()print(f"host: {args.host}, port: {args.port}")

我们看到当 host 不指定的时候,就会报错。并且我们还通过 default 参数指定了默认值。

然后是参数值的类型,不管什么参数,只要我们在命令行当中传递了,那么解析出来的默认都是字符串类型。

import argparseparse = argparse.ArgumentParser()parse.add_argument("-p", dest="port", default=6379)args = parse.parse_args()print(f"port 类型: {args.port.__class__}")

那么可不可以指定参数的类型呢?答案是可以的。

import argparseparse = argparse.ArgumentParser()parse.add_argument("-p", dest="port", type=int)args = parse.parse_args()print(f"port 类型: {args.port.__class__}")

通过指定 type 为 int,那么在将参数值解析出来之后就会调用 int 进行转化,转化失败则报错。

同理,我们也可以换成其它类型,举个例子。

还是很简单的,甚至换成我们自定义的类,或者一个函数也是可以的,

此时我们就实现了给一个参数传递多个值,不过这种做法属于是曲线救国,我们应该通过另一个参数实现。

nargs 指定为 *,那么表示 --hobby 可以接收多个值,并且值之间使用空格进行分隔,最终会得到一个列表。如果指定 --hobby,但是不传值,那么会得到空列表。

以上就是 argparse 的基本用法,更多内容可以参考官方文档。

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

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

相关文章

计算机视觉OpenCv学习系列:第七部分、图像操作-3

第七部分、图像操作-3第一节、图像统计信息1.像素值统计2.函数支持说明3.代码练习与测试第二节、图像直方图1.图像直方图定义2.直方图函数3.代码练习与测试第三节、图像直方图均衡化1.直方图均衡化2.直方图均衡化函数3.代码练习与测试学习参考第一节、图像统计信息 1.像素值统…

零基础学JavaWeb开发(二十一)之 spring框架(4)

3、AOP详解 3.1、Aop常用术语 1.连接点(Join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。类中的哪些方法可以被增强,这些…

详解动态规划01背包问题--JavaScript实现

对其他动态规划问题感兴趣的,也可以查看详解动态规划最少硬币找零问题--JavaScript实现详解动态规划最长公共子序列--JavaScript实现一开始在接触动态规划的时候,可能会云里雾里,似乎能理解思路,但是又无法准确地表述或者把代码写…

车辆占用应急车道识别抓拍系统 opencv

车辆占用应急车道识别抓拍系统通过opencvpython人工智能识别技术,对高速公路应急车道进行不间断实时监测,当监测到应急车道上有车辆违规占用时,立即告警提醒后台人员及时处理避。OpenCV的全称是Open Source Computer Vision Library&#xff…

【18】C语言 | 数组详解

目录 1、数组的格式 2、下列有什么区别 3、维数组的使用 4、*p 和 int* p arr 的含义 5、二维数组:打印一个二维数组 6、二维数组在数组中的存储 7、数组作为函数参数 8、数组名是数组首元素的地址 1、数组的格式 数组是一组相同类型元素的集合。 数组的创…

20230123英语学习

Interesting Studies to Spark Your Interest in the Research Field 科研也可以很有趣!盘点那些好玩的研究 When it comes to picking studies worth reading, what scientists deem an interesting science article might be perceived differently by a person…

【Datewhale一起吃瓜 Task2】啃瓜第三章

文章目录线性模型关键:找到合适的w和b如何找到合适的 w和b?偏导为什么可以?推广线性模型 任务:找出一条线能够对数据进行划分或预测趋势 关键:找到合适的w和b 更适合于连续性的数值,如果数据是离散的如色…

AcWing 1020. 潜水员(二维费用背包)

一、问题 二、思路 这道题其实很容易看出是一个二维费用背包的变形,如果我们将氧气看作体积,将氮气看作价值的话,这道题就变成了从iii个物品里面选,体积至少为mmm,价值至少为nnn的条件下,所携带的物品的最…

Maplab:一个用于视觉惯性建图和定位研究的开源框架

摘要 鲁棒且精确的视觉惯性估计是当今机器人领域的重要挑战。能够用先验地图(prior map)进行定位(localize)并获得准确且无漂移的姿态估计,可以推动该系统的适应性。然而,目前大多数可用的解决方案都集中在单次使用,缺乏定位能力或端到端流水…

Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?

[1] 先讨论一个面试题 int a 1; Integer b 1; Integer c new Integer(1); Integer d Integer.valueOf(1); int e d; int f d.intValue();请问以下式子的值?为什么? a b // true a c // true b c // false[2] ""与"equals"…

C++设计新思维(泛型编程与设计模式之应用)之常整数映射为类别(2.4)

技术 模板偏特化,模板全特化 应用 1、有必要根据一个编译期常数调用一个或数个不同的函数 2、有必要在编译器实施"分派"(dispatch) 例子 如果打算在执行期进行分派(dispatch),可使用if-else或switch语句。大部分时候其执行期成本都微不足…

windows权限维持方法详解

权限维持在获取服务器权限后,为了防止服务器管理员发现和修补漏洞而导致对服务器权限的丢失,测试人员往往需要采取一些手段来实现对目标服务器的持久化访问。权限持久化(权限维持)技术就是包括任何可以被测试人员用来在系统重启、…

Allegro如何通过飞线判断同一个网络连接位是否在同一直线操作指导

Allegro如何通过飞线判断同一个网络连接位是否在同一直线操作指导 Allegro可以通过飞线判断同一个网络的连接位是否在同一条直线上,如下图 当飞线是类似三角形的时候,可以判定两个连接点位是在同一条直线上 具体设置操作如下 选择Setup选择Design Parameter

React源码之render过程中发生了什么?

理解JSX 对于我们直接书写jsx语法&#xff0c;我们的浏览器是不理解我们这种语法的&#xff0c;所以需要babel来去转义&#xff0c;那么可以通过plugin-transform-react-jsx来转译jsx语法&#xff0c;使得浏览器可以识别我们的Jsx语法&#xff0c;例如&#xff1a; <div&g…

关于xshell简答使用

xshell是一个远程工具下载 官网地址&#xff1a;https://www.xshell.com/zh/xshell/直接下载即可~选择免费的授权页面 下载 不然要收费 也不要用盗版。运行后的xshell界面我们要建立服务器的连接点击加号 新建连接 即可 输入连接地址后 要输入 账号 和 秘密 OK 好了 可以使用了…

【Linux】Linux编译器gcc、g++

文章目录&#x1f3aa; Linux编译器gcc、g&#x1f680;1. 程序的编译⭐1.1 预处理⭐1.2 编译⭐1.3 汇编⭐1.4 链接⭐1.5 gcc/g常用指令&#x1f680;2. 函数库⭐2.1 静态库⭐2.2 动态库⭐2.3 动静态库对比&#x1f3aa; Linux编译器gcc、g 我们这以gcc为例&#xff0c;g编译器…

【学习笔记之数据结构】树的认识

树的概念&#xff1a; 树是一种非线性的数据结构&#xff0c;它由n&#xff08;n可以为0&#xff09;个有限的节点组成一个具有层次关系的结合。之所以把它称之为树是因为它的逻辑结构形似一个倒着的树。它的根在上面&#xff0c;叶子在下面。   有一个特殊的节点&#xff0c…

WebRTC系列-Qos系列之接收NACK

文章目录 1. 主要调用流程1.1 RTCP和RTP包区分1.2 查找丢失包2. RTX在文章 WebRTC系列-Qos系列之RTP/RTCP源码分析-RTP/RTCP包解析-3的2.3.3章节介绍了NACK包在WebRTC中解析方式及RFC规定协议的定义。 这篇文章开始,详细分析其接受RTCP包到解析nack的处理流程; 1. 主要调用流…

Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家 &#x1f449;点击跳转到教程 一、Kotlin的可空性 null 在java中我们司空见惯的空指针异常NullPointerException,带给了我们很多麻烦。 Kotlin作为更强…

STM32编写OLED显示屏驱动

文章目录前言一、OLED的器件地址二、编写写数据和写命令函数三、编写初始化OLED屏幕函数四、其他功能函数编写五、显示字符和数字函数编写总结前言 这篇文章将带大家学习如何编写OLED显示屏的驱动程序。这里我使用的是HAL库的硬件IIC&#xff0c;OLED屏幕使用的是SSD1306的。 …