【Python】argparse模块详解

2023-05-16

Python argparse模块详解

argparse 是一个用来解析命令行参数的 Python 库,它是 Python 标准库的一部分。基于 python 2.7 的 stdlib 代码。argparse 模块使编写用户友好的命令行界面变得容易。程序定义了所需的参数,而 argparse 将找出如何从 sys.argv 中解析这些参数。argparse 模块还会自动生成帮助和使用消息,并在用户为程序提供无效参数时发出错误。

简单实现圆柱体体积的计算

为了便于对argparse命令行参数解析模块的理解,我们先从一个简单的程序入手:

import math


def cylinder_volume(radius, height):
    vol = (math.pi) * (radius ** 2) * height
    return vol


if __name__ == '__main__':
    print(cylinder_volume(2, 4))

通过PyCharm执行代码,其显示的结果:

在这里插入图片描述

通过命令行的方式执行代码,其显示的结果:

在这里插入图片描述

可以看到如果使用命令行方式,需要先进入将要执行的xxx.py文件所在的文件目录下,并输入python xxx.py即可。

使用argparse模块实现圆柱体体积的计算

  1. 导入argparse模块

    import argparse
    
  2. 创建一个解析对象parser

    parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
    

    其中,parser解析对象相当于一个用来装载参数的容器,而description用来描述解析对象。

  3. 添加命令行参数

    parser.add_argument('radius', type=int, help='Radius of Cylinder')
    parser.add_argument('height', type=int, help='Height of Cylinder')
    args = parser.parse_args()
    

    在计算圆柱体体积的例子中,需要的参数由两个分别是radius和height,所以需要向解析对象中添加这两个参数,参数的类型定义为int类型,其中help用来对参数进行描述说明。

  4. 将原函数实参换成命令行参数

    print(cylinder_volume(args.radius, args.height))
    
  5. 完整代码复现

    import math
    import argparse
    
    parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
    parser.add_argument('radius', type=int, help='Radius of Cylinder')
    parser.add_argument('height', type=int, help='Height of Cylinder')
    args = parser.parse_args()
    
    
    def cylinder_volume(radius, height):
        vol = (math.pi) * (radius ** 2) * height
        return vol
    
    
    if __name__ == '__main__':
        print(cylinder_volume(args.radius, args.height))
    
  6. 执行代码

    在PyCharm中直接执行代码,其结果显示:

在这里插入图片描述

PyCharm会直接报错,因为这段代码需要传入参数。

现在通过命令行的方式执行代码,其结果显示:

在这里插入图片描述

可以看见结果与之前的是一样的。

接着,我们可以调用–help或-h参数来查看程序的描述:

在这里插入图片描述

现在,我们尝试将先前传入的参数顺序进行改变,得到的结果如下:

在这里插入图片描述

可以看见结果就完全不一样了,从help中的提示信息知道,传入的参数需要按照严格的顺序进行,然而,在日常中,可能涉及到的参数数目较多,对于参数的顺序不是那么好记忆,这时我们可以对原先的代码进行修改,使其能使用选择性参数来进行:

parser.add_argument('-r', '--radius', type=int, help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, help='Height of Cylinder')

这里需要注意,由于 ‘-h’ 参数已经被help命令占用,所以对于height,我们使用 ’-H‘ 。

下面是再次执行代码的显示结果:

在这里插入图片描述

现在,我们通过 ’-h‘ 来查看程序的描述:
在这里插入图片描述

如果想让上面的描述看起来比较简洁,可以将代码进行修改:

parser.add_argument('-r', '--radius', type=int, metavar='', help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', help='Height of Cylinder')

现在,我们再次通过 ’-h‘ 来查看效果:

在这里插入图片描述

那现在如果只输入一个参数,结果会怎样呢?

在这里插入图片描述

可以看到报错信息中,那个没有具体指定数值的参数会被赋予None值,为了避免这种情况,我们可以对代码进行如下修改:

parser.add_argument('-r', '--radius', type=int, metavar='', required=True, help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', required=True, help='Height of Cylinder')

现在再来执行一次:

在这里插入图片描述

可以看到此时会提示需要添加的参数。

互斥参数的介绍

现在我们尝试添加互斥组:

group = parser.add_mutually_exclusive_group()
group.add_argument('-q', '--quiet', action='store_true', help='print quiet')
group.add_argument('-v', '--verbose', action='store_true', help='print verbose')

首先建立一个group容器,接着向其中添加参数,action参数赋值为’store_true‘意味着当在命令中添加’-q‘或者’–quiet‘(’-v‘或者’–verbose‘)时,程序将对args.quiet赋值为true,而默认情况下为false。接着利用这一原理,我们就可以对main函数的内容进行修改:

volume = cylinder_volume(args.radius, args.height)
    if args.quiet:
        print("quiet: %s" % volume)
    elif args.verbose:
        print("verbose: %s" % volume)
    else:
        print("Volume of a Cylinder with radius %s and height %s is %s" % (args.radius, args.height, volume))

现在进行命令行测试,查看效果:

在这里插入图片描述
需要注意的是,互斥的含义是指不能同时参入互斥组中的参数,即只有一个参数能成立,如果强行传入互斥组中两个以上的参数,则会出现如下错误提示:

在这里插入图片描述

完整版改进代码

import math
import argparse

parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
parser.add_argument('-r', '--radius', type=int, metavar='', required=True, help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', required=True, help='Height of Cylinder')
group = parser.add_mutually_exclusive_group()
group.add_argument('-q', '--quiet', action='store_true', help='print quiet')
group.add_argument('-v', '--verbose', action='store_true', help='print verbose')
args = parser.parse_args()


def cylinder_volume(radius, height):
    vol = (math.pi) * (radius ** 2) * height
    return vol


if __name__ == '__main__':
    volume = cylinder_volume(args.radius, args.height)
    if args.quiet:
        print("quiet: %s" % volume)
    elif args.verbose:
        print("verbose: %s" % volume)
    else:
        print("Volume of a Cylinder with radius %s and height %s is %s" % (args.radius, args.height, volume))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】argparse模块详解 的相关文章

随机推荐

  • Oracle 知识篇+几种常见的关系型数据库产品发展史

    说明 xff1a 本文为几种常见的关系型数据库产品发展史的简要描述 xff0c 供RDBMS兴趣爱好者参考温馨提示 xff1a 如果本文有写的不对的地方或者需要改进的地方 xff0c 各位可以留言或私信我进行修改和升级哦 下表为几款RDBM
  • MoveIt编程实现机械臂自主避障运动

    Moveit在规划路径的时候考虑如何躲避障碍物的问题 xff0c Moveit可以实时的检测空间中的障碍物 xff0c 并规划处轨迹绕过障碍物 在场景中加入障碍物方式 在Moveit中 具有一个规划场景监听器的模块结构 xff0c 可以用来
  • 在ROS中基于颜色做简单的物体识别

    ROS无法直接进行图像处理 xff0c 需要借助于opencv xff0c 要使用cv bridge把ROS 的图像数据格式转为Opencv可以使用的数据格式 即是一个提供ROS和OpenCV库提供之间的接口的开发包 然后可以将opencv
  • Docker下运行GUI应用

    Docker本身的工作模式是命令行的 xff0c 因为主要的使用场景可能是做服务器后端方面的比较多 但有时候我们会有在docker容器里运行一些图形界面的软件 xff0c 比如使用ROS时候需要gazebo和rviz的可视化这时候就需要使用
  • Linux 烤机

    Linux 烧机测试 我发现这方面的知识比较少 xff0c 在Google只看到来自http blog jpps tcc edu tw的文章 好东西要珍惜 xff0c 特此转载 再一次对博主表示感谢 剛組裝了一部6核心的電腦 AMD 105
  • 小狼毫输入法

    找了一些五笔输入法 xff0c 都不太理想 xff0c 今天又找了一个输入法 xff1a 小狼毫 用了一下这个输入法 xff0c 带来了一些惊喜 这个输入法并不是一个新的输入法 xff0c 而是一个输入法框架 xff0c 集合了众多输入法
  • 关于航模的几点总结积累

    关于航模的几点积累 xff1a 一 关于机型 xff1a 1 固定翼飞行器分类 按外观 xff1a 像真机 xff0c 非像真机 按主翼位置 xff1a 上单翼 xff0c 中单翼 xff0c 下单翼 按动力来源 xff1a 电动 xff0
  • 移植FreeRTOS时出现了Undefined symbol xTaskGetSchedulerState (referred from delay.o).

    当我们使用正点原子进行FreeRTOS移植实验时 xff0c 会出现了freertos axf Error L6218E Undefined symbol xTaskGetSchedulerState referred from delay
  • 为什么结构体指针需要malloc申请空间

    例如此时 xff1a int init struct Node head 结构体指针 初始化 struct Node newnode 61 struct Node malloc sizeof struct Node if NULL 61 6
  • centos7.5配置本地镜像源

    1 把完整版镜像ISO文件加载到光驱 2 创建挂载路径 xff1a root 64 localhost mkdir mnt cdrom 3 挂载ISO镜像到设置好的挂载路径 xff1a root 64 localhost mount dev
  • docker镜像使用方法(查看、删除、更新、创建)

    docker镜像使用方法 xff08 查看和删除 xff09 ps ef grep docker 查看docker进程 docker info 查看docker信息 docker images 列出本地主机上的镜像 docker searc
  • h3c网络设备中dis lldp nei list查看邻居

    可查看本端对端的接口 xff0c 设备名字 可以先在网关搜集ARP表 xff0c 根据ARP表里面的IP MAC 端口号后再使用dis lldp nei list查看邻居 xff0c 对比一下MAC表 xff0c 就知道是哪台设备了 前提是
  • H3C认证网络工程师(H3CNE)

    H3C认证网络工程师 H3CNE 1 sysname 更改系统名 2 display clock 显示系统时间 3 clock datetime 修改系统时间 4 display cur 显示当前运行的配置 5 save 保存配置 6 re
  • centos增加一个新磁盘

    1 在CAS或VMWARE等虚拟化平台里为虚拟机增加一个新磁盘 2 使用lsblk查看系统中是否有新增的硬盘 xff0c 如果没有 xff0c 重启一下系统就可以了 3 分区 xff1a fdisk dev sdb 按照提示输入m调出菜单
  • cas下linux虚拟机在线扩容磁盘

    cas下linux在线扩容磁盘 xff1a 1 修改虚拟机配置 xff0c 扩大需要扩容的磁盘 xff0c 然后以root进入系统 xff0c lsblk查看扩容的空间 2 使用growpart扩展分区 root 64 zgy growpa
  • 堆叠+链路聚合+OSPF

    1 配置IRF堆叠 swa inter range ten gig1 0 49 to ten gig1 0 52 shutdown swa irf port 1 1 port group inter ten gig 1 0 49 port
  • 正则表达式基础语法例子

    literal 功能 xff1a 匹配文本字符串的字面值 literal 例子 xff1a foo re1 re2 功能 xff1a 匹配正则表达式 re1 或者 re2 例子 xff1a foo bar 功能 xff1a 匹配任何字符 除
  • ubuntu升级python3.5到python3.10

    wget https www python org ftp python 3 10 0 Python 3 10 0 tgz tar zxvf Python 3 10 0 tgz cd Python 3 10 0 configure conf
  • CAS5.3单点登录(二)连接mysql数据库

    上一章说cas服务器中的登录帐号名是配置中写死的 xff0c 实际情况中不太可能仅有一个用户 xff0c 而是将所有用户存在一个数据库表中 xff0c 以便对登录帐号进行增删改的处理 本章就来讲述如何配置cas连接数据库 xff08 一 x
  • 【Python】argparse模块详解

    Python argparse模块详解 argparse 是一个用来解析命令行参数的 Python 库 xff0c 它是 Python 标准库的一部分 基于 python 2 7 的 stdlib 代码 argparse 模块使编写用户友好