Python参数解析模块sys、getopt、argparse使用与对比分析


Posted in Python onApril 02, 2019

一些命令行工具的使用能够大大简化代码脚本的维护成本,提升复用性,今天主要是借助于python提供的几种主流的参数解析工具来实现简单的功能,主要是学习实践为主,这是新年伊始开工的第一篇,还是花了一番功夫来完成写作的和实验的,希望能够帮到需要的朋友们,新的一年里,祝大家心想事成!

好了,废话不多说,下面进入正文。

Python中有三个内建的模块用于处理命令行参数:

第一个:sys,最简单,只能够提供简单的参数解析功能

第二个:getopt,只能简单的处理命令行参数 ,较sys封装更好一点

第三个:argparse,使其更加容易的编写用户友好的命令行接口。它所需的程序进程了参数定义,argparse将更好的解析    sys.argv。同时argparse模块还能自动生成帮助及用户输入错误参数时的提示信息。

在命令行参数中分为“-”和“--”两种模式,具体的使用方法以及与异同点我都会在下面的实际使用中介绍到,主要是正确完成对两种命令参数模式的区分就行了。接下来的实践中,首先以sys模块为例,来观察该模块的参数解析过程,具体实践如下:

def sysFunc():
  '''
  基于 sys 模块的简单参数解析功能
  选项的写法要求:
对于短格式:
        "-"号后面要紧跟一个选项字母,如果还有此选项的附加参数,可以用空格分开,也可以不分开。
        长度任意,可以用引号。
        如: -h  -ls -l s  等等
  对于长格式:
       "--"号后面要跟一个单词,如果还有些选项的附加参数,后面要紧跟"=",再加上参数。
       "="号前后不能有空格。
       如: --input=data.txt
  长格式是在Linux下引入的,许多Linux程序都支持这两种格式。在Python中提供了getopt模块很好
  的实现了对着两种用法的支持,而且使用简单。
  执行示例:
       python demo.py -d data.txt
       python demo.py --data=data.txt
  '''
  if len(sys.argv)==1: 
    print 'Nothing need to be done!' 
    sys.exit()
  else:
    para_list=sys.argv
    print 'Parameters is: ',para_list
    if para_list[1].startswith('--'):
      print 'DataFile name is: ',para_list[1].split('=')[-1].strip()
      print 'Longopts,do your actions here!!!'
    elif para_list[1].startswith('-'):
      print 'DataFile name is: ',para_list[2]
      print 'Shortopts,do your actions here!!!'

关于该模块的使用和注意事项我在上面的代码片段中已经解释清楚了,相信很容易理解,我也附上了执行示例,接下来我们执行一下上述代码结果如下:

Python参数解析模块sys、getopt、argparse使用与对比分析

接下来我们使用getopt模块来进行参数命令行的解析操作,代码中我们选用IP和端口两个属性作为待传入的参数,具体实践如下:

def getoptFunc():
  '''
  基于 getopt 模块来实现参数解析功能
  函数getopt(args,shortopts,longopts=[])
    参数args一般是sys.argv[1:]
    shortopts 短格式 (-) 
    longopts 长格式(--) 
  注意点:
      定义命令行参数时,要先定义带'-'选项的参数,再定义没有‘-'的参数
  执行示例:
      python demo.py -i 172.19.7.217 -p 8066 data.txt 88
      python demo.py --ip=172.19.7.217 --port=8066 data.txt 88
  '''
  if len(sys.argv)==1:
    print 'Nothing need to be done!'
    sys.exit()
  try:
    opts,args=getopt.getopt(sys.argv[1:],"hp:i:",["help","ip=","port="]) #过滤掉脚本名称
    '''
    opts是个包含元祖的列表,args是个列表,包含那些没有‘-'或‘--'的参数
    短格式 --- h 后面没有冒号:表示后面不带参数,p:和 i:后面有冒号表示后面需要参数
    长格式 --- help后面没有等号=,表示后面不带参数,其他三个有=,表示后面需要参数
    '''
    print 'opts: ',opts
    print 'args: ',args
  except getopt.GetoptError:
    print "argv error,please input"
    sys.exit()
  #打印具体参数
  map_dict={'-i':'IP','--ip':'IP','-p':'Port','--port':'Port'}
  for name,value in opts:
    if name in ("-h","--help"):
      print  """
          Usage:sys.args[0] [option]
          -h or --help:显示帮助信息
          -p or --ip: IP地址
          -p or --port: IP端口
          """
    if name in ('-i','--ip','-p','--port'):
      print '{0} is=======>{1}'.format(map_dict[name],value)

使用getopt模块分析命令行参数大体上分为三个步骤:

  • 1.导入getopt, sys模块
  • 2.分析命令行参数
  • 3.处理结果       

同样我们加入了详细的注释与说明帮助理解该模块的工作机制,我们也附上了相关的执行示例,运行上述代码得到的结果如下图所示:

Python参数解析模块sys、getopt、argparse使用与对比分析

最后我们实践一下argparse模块,该模块相对于前两个模块而言,封装程度更为高级,使用也更为方便一下,具体的实践如下:

def argparseFunc():
  '''
  基于argparse模块实现高级的参数解析功能
  执行示例:
       python demo.py -i 172.19.7.236 -p 7077 -f -w
       python demo.py -i 172.19.7.236 -p 7077 -f -r
  '''
  parser=argparse.ArgumentParser(description="show example") #使用argparse的构造函数来创建对象
  parser.add_argument("-i","--ip",help="IP Address") #添加可解析的参数
  parser.add_argument("-p","--port",help="IP Port") #添加可解析的参数
  parser.add_argument("-f","--flag",help="Flag",action="store_true") #action=store_true的意义是如果使用了这个参数则值默认为TRUE
  exptypegroup=parser.add_mutually_exclusive_group() #添加一组互斥的选项,如上例中的-l和-r只能用一个
  exptypegroup.add_argument("-r","--read",help="Read Action",action="store_true")
  exptypegroup.add_argument("-w","--write",help="Write Action",action="store_true")
  ARGS=parser.parse_args()
  print 'ARGS:',ARGS
  if ARGS.ip:
    print "IP is: "+ARGS.ip
  if ARGS.port:
    print "Port is: "+ARGS.port
  if ARGS.flag:
    print "Flag is: "+str(ARGS.flag)
  if ARGS.read:
    print "Read action is: "+str(ARGS.read)
  if ARGS.write:
    print "Write action is: "+str(ARGS.write)

该模块的使用较为广泛,首先使用该模块提供的构造函数来创建一个ArgumentParser对象,后续的参数传入和指定等工作都是基于ArgumentParser对象来进行的,其中,add_argument用来添加参数对象选项,add_mutually_exclusive_group用于添加互斥的选项,比如:上述的读操作和写操作就是互斥的,上述代码中我们给出了执行示例,同样我们依旧是基于IP和端口两个参数选项进行实验,结果如下所示:

Python参数解析模块sys、getopt、argparse使用与对比分析

我们想知道,声明好的互斥的参数选项是否真的是不能同时使用呢?这里简单的执行一下就行了:

Python参数解析模块sys、getopt、argparse使用与对比分析

从上面的error信息中我们看到了argparse模块给我们的反馈信息是读写操作不被允许同时使用,说明了上述我们声明的互斥参数是正常工作了的。

三个模块,三种参数解析的实践也只能是对其达到初步了解的目的,希望有了一定的了解与认识之后再使用到具体的项目中去相信效果会更好一些。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python打开文件并获取文件相关属性的方法
Apr 23 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
Python实现的密码强度检测器示例
Aug 23 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
pyspark 随机森林的实现
Apr 24 Python
Python中三维坐标空间绘制的实现
Sep 22 Python
python自动化之如何利用allure生成测试报告
May 02 Python
详解Python自动化之文件自动化处理
Jun 21 Python
python flask安装和命令详解
Apr 02 #Python
详解python 3.6 安装json 模块(simplejson)
Apr 02 #Python
Pyinstaller打包.py生成.exe的方法和报错总结
Apr 02 #Python
Python3字符串encode与decode的讲解
Apr 02 #Python
深入了解和应用Python 装饰器 @decorator
Apr 02 #Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 #Python
浅谈python的输入输出,注释,基本数据类型
Apr 02 #Python
You might like
php正则校验用户名介绍
2008/07/19 PHP
PHP Stream_*系列函数
2010/08/01 PHP
php自定义hash函数实例
2015/05/05 PHP
PHP实现生成唯一会员卡号
2015/08/24 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
Pytorch提取模型特征向量保存至csv的例子
2020/01/03 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
禁毒宣传工作方案
2014/05/23 职场文书
森林防火宣传标语
2014/06/27 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
消防安全月活动总结
2015/05/08 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python