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服务器端收发请求的实现代码
Sep 29 Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 Python
基于windows下pip安装python模块时报错总结
Jun 12 Python
python中的for循环
Sep 28 Python
python实现淘宝秒杀脚本
Jun 23 Python
Python进阶之@property动态属性的实现
Apr 01 Python
画pytorch模型图,以及参数计算的方法
Aug 17 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
django连接mysql数据库及建表操作实例详解
Dec 10 Python
Python pip install如何修改默认下载路径
Apr 29 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/09/29 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
php支付宝接口用法分析
2015/01/04 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
利用Python实现kNN算法的代码
2019/08/16 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
python实现移动木板小游戏
2020/10/09 Python
在Python中实现字典反转案例
2020/12/05 Python
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
什么是Smart Navigation?
2016/07/03 面试题
幼儿园实习自我鉴定
2013/12/15 职场文书
国培远程培训感言
2014/03/08 职场文书
禁烟标语大全
2014/06/11 职场文书
主要领导对照检查材料
2014/08/26 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书