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 web程序
Sep 11 Python
python和ruby,我选谁?
Sep 13 Python
Python快速排序算法实例分析
Nov 29 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
May 04 Python
Python使用LDAP做用户认证的方法
Jun 20 Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 Python
Python连接SQLite数据库并进行增册改查操作方法详解
Feb 18 Python
Sentry错误日志监控使用方法解析
Nov 12 Python
七个Python必备的GUI库
Apr 27 Python
超详细Python解释器新手安装教程
May 10 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中smarty模板条件判断用法实例
2015/06/11 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
基于jQuery实现的单行公告活动轮播效果
2017/08/23 jQuery
JavaScript实现图片拖曳效果
2017/09/08 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
vue表单自定义校验规则介绍
2018/08/28 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
如何用Python合并lmdb文件
2018/07/02 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
HTML5图片预览实例分享
2014/06/04 HTML / CSS
同程旅游英文网站:LY.com
2018/11/13 全球购物
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
区域销售经理职责
2013/12/22 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
团组织推荐意见
2015/06/05 职场文书
大学生支教感言
2015/08/01 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技