热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python教程分享Python详解argparse参数模块之命令行参数

前言help(argparse)查看说明文档,“argparse-command-lineparsinglibrary”我们可以知道是一个命令行解析库,是关

前言

help(argparse)查看说明文档,“argparse – command-line parsing library”我们可以知道是一个命令行解析库,是关于参数解析相关的一个模块。

示例一:最简参数对象

先来一段简单的代码,快速熟知下这个参数是个啥。
保存为t.py这样一个文件

import argparse  parser = argparse.argumentparser(description='最简单的测试')  parser.add_argument('--test', type=str, default='china')  args = parser.parse_args()  print(args.test)

然后我们在命令行中运行这个文件

c:userstony>python t.py –test "i love china"
i love china

我们来分析下这段代码,首先就是创建一个参数解析对象赋给parser,然后在parser对象中使用add_argument方法添加参数以及各种选项,其中–test就是参数,这个参数的名称依其作用自定义,type=str指定输入值类型为字符串,default='china'是默认值,就是说如果不指定参数,就显示china这个默认值
对于parser.parse_args()解析参数之后的调用,需要说明下,如果没有指定dest,那就是直接调用去掉短横线的名称,如果指定了,比如dest='showstr',那么就调用args.showstr属性,如果还是调用test就会报错,需要修改为print(args.showstr)
attributeerror: 'namespace' object has no attribute 'test'

示例二:整数求和

若没有指定参数就取这些整数当中的最大值:

#p.py  import argparse  #创建argumentparser对象,用来解析  parser = argparse.argumentparser(description='处理一些整数')  #向对象添加参数  parser.add_argument('integers', metavar='n', type=int, nargs='+',help='累加的整数')  parser.add_argument('--sum', dest='accumulate', action='store_const',cOnst=sum, default=max,help='求和(默认求最大值)')  #解析参数  args = parser.parse_args()  print(args.accumulate(args.integers))

其中调用parse_args()方法时,将返回两个参数属性(integers和accumulate),integers属性是一个或多个的整数,accumulate属性是sum()求和函数,如果没有–sum参数的话就是默认max()最大值函数,default=max
另外n可以指定个数,nargs='+',表示一个或多个,对正则表达式熟悉的那就很简单了,是一个通配符,另外还有'?'表示一个,'*'表示0个或多个。

print(parser.parse_args(['--sum','1','33','5','6']))  '''  namespace(accumulate=, integers=[1, 33, 5, 6])  '''

我们可以看到出现一个命名空间,其中accumulate属性是一个sum方法, integers属性是一系列的整数。

可以查看使用帮助说明:

c:userstony>python p.py -h

usage: p.py [-h] [–sum] n [n …]

处理一些整数

positional arguments:
  n           累加的整数

optional arguments:
  -h, –help  show this help message and exit
  –sum       求和(默认求最大值)

带参与不带参的操作:

c:userstony>python p.py 1 33 5 6
33

c:userstony>python p.py -sum 1 33 5 6

c:userstony>python p.py 1 33 5 6 –sum
45

当然如果是没有按照参数设定的情况,会报错: 

c:userstony>python p.py
#需要输入值n
usage: p.py [-h] [–sum] n [n …]
p.py: error: the following arguments are required: n

c:userstony>python p.py 1 33 5.1 6
#需要输入整数,浮点数就报错
usage: p.py [-h] [–sum] n [n …]
p.py: error: argument n: invalid int value: '5.1'

可以看出这个参数对象除了可以在命令行界面方便使用之外,还可以对其做一些严格的限定。比如类型的限定,示例二的类型指定为int,那就不能是浮点数,如果可以是浮点数就指定成type=float

示例三:文件是否被篡改

我们来看下,test目录下面(放了三个文python教程分享Python详解argparse参数模块之命令行参数件),生成每个文件的md5值,如果和官网提供的md5一样就说明内容没有被篡改,执行完之后将显示每个文件生成的md5值以及生成一个名为"目录后缀.txt"文档(内容一样)

#m.py  import os  from hashlib import md5  import argparse     def parse_args():      parser =argparse.argumentparser()      parser.add_argument('--file_dir', type=str)      return parser.parse_args()  def generate_md5(file_path):      m =md5()      file = open(file_path, 'rb')      f = file.read()      m.update(f)      file.close()      return m.hexdigest()     if __name__ == '__main__':      args = parse_args()      file_dir = args.file_dir      log_path = args.file_dir + '.txt'      log = open(log_path, 'w+')      for root, _, files in os.walk(file_dir):          for file in files:              file_path = os.path.join(root, file)              md5_value = generate_md5(file_path)              print(file + " : " + md5_value)              log.write(file + " : " + md5_value + 'n')

命令行执行:

c:userstony>python m.py –file_dir "c:/users/tony/test"
1.txt : 81dc9bdb52d04dc20036dbd8313ed055
2.txt : d84b0391f5ce6b011e4086ed73d9dd9b
3.txt : 2b3b15ac34d69fa01e851d483e61f029

这段代码可以看出,只需指定一个文件目录的参数即可求出目录下面所有文件的md5值。当然也可以跟示例二那样做一些说明:parser.add_argument('–file_dir', type=str,help='指定文件所在目录') 加一个help参数的说明文字。

c:userstony>python m.py -h
usage: m.py [-h] [–file_dir file_dir]

optional arguments:
  -h, –help           show this help message and exit
  –file_dir file_dir  指定文件所在目录

parser = argparse.argumentparser('对文件批量生成md5值')  parser.add_argument('--file_dir',dest='fdir',type=str,help='指定文件所在目录')  print(parser.print_help())  '''  usage: 对文件批量生成md5值 [-h] [--file_dir fdir]  optional arguments:    -h, --help       show this help message and exit    --file_dir fdir  指定文件所在目录  none  '''

自定义类型

除了基本类型之外,还可以自定义类型,如下定义一个类型只能是完全平方数的值

#d.py  import argparse  import math     def perfect_square(s):      v=int(s)      vs=math.sqrt(v)      if vs!=int(vs):          msg="%r 不是一个完全平方数" %s          raise argparse.argumenttypeerror(msg)      return v  parser=argparse.argumentparser(description='自定义类型')  parser.add_argument('hi',type=perfect_square,help='只能是完全平方数')  args = parser.parse_args()  print(args.hi)

命令行运行:

c:userstony>python d.py 3
usage: d.py [-h] hi
d.py: error: argument hi: '3' 不是一个完全平方数

c:userstony>python d.py -h
usage: d.py [-h] hi

自定义类型:

positional arguments:
  hi          只能是完全平方数

optional arguments:
  -h, –help  show this help message and exit

可以看到hi参数是一个positional arguments(位置参数),也就是说是必须的,不像前面有短横线的optional arguments(可选参数)

choices选项限定

除了上述类型限定和可以自定义类型之外,还可以限定在一些自定义的范围内

#c.py  parser=argparse.argumentparser(description='自定义选项')  parser.add_argument('sel',type=int,choices=range(1,9),help='请输入[1-9)范围的整数')  args = parser.parse_args()  print(args.sel)

命令行执行:
c:userstony>python c.py 10
usage: c.py [-h] {1,2,3,4,5,6,7,8}
c.py: error: argument sel: invalid choice: 10 (choose from 1, 2, 3, 4, 5, 6, 7, 8)

required必选参数

我们也可以对可选参数指定为必选,不指定的情况:

parser=argparse.argumentparser(description='自定义选项')  parser.add_argument('--sel',type=int,choices=range(1,9),help='请输入[1-9)范围的整数')  print(parser.parse_args([]))

这个例子,我们知道sel参数是可选的,这样不会出错,结果:namespace(sel=none)
如果加一个required=true

parser.add_argument('--sel',required=true,type=int,choices=range(1,9),help='请输入[1-9)范围的整数')  #执行就会报错:  usage: ipykernel_launcher.py [-h] --sel {1,2,3,4,5,6,7,8}  ipykernel_launcher.py: error: the following arguments are required: --sel  an exception has occurred, use %tb to see the full traceback.  #这个时候的参数sel就是必选参数了  print(parser.parse_args(['--sel','2']))  namespace(sel=2)

子命令

主要是set_defaults方法的用途,在多个解析器的时候显得很重要。  #s.py  def f(v):       r=v.x + v.y + v.z       print('x+y+z=',r)  parser = argparse.argumentparser(description='求三个输入值的和')  subparsers = parser.add_subparsers(help='子命令的用法')  parser_a = subparsers.add_parser('add', help='加法运算')  parser_a.add_argument('--x', type=int)  parser_a.add_argument('--y', type=int)  parser_a.add_argument('--z', type=int)  parser_a.set_defaults(func=f)#parser_a设置默认函数为f  args = parser.parse_args()  args.func(args)#运行函数

命令行执行:

c:userstony>python s.py add –x 11 –y 2 –z 9
x+y+z= 22

到此这篇关于python详解argparse参数模块之命令行参数的文章就介绍到这了,更多相关python argparse 内容请搜索<编程笔记>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<编程笔记>!

需要了解更多python教程分享Python详解argparse参数模块之命令行参数,都可以关注python教程分享栏目&#8212;编程笔记


推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
author-avatar
ngdongran_638070
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有