Python命令行解析模块详解


Posted in Python onFebruary 01, 2018

本文研究的主要是Python命令行解析模块的相关内容,具体如下。

Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块。下面就解读下这两种解析器。

getopt模块

这个模块可以帮助脚本解析命令行参数,一般是sys.argv[1:]。它遵循着Unix的getopt()函数相同的约定(用-/--指定命令参数)。这个模块提供两个函数(getopt.getopt()/getopt.gnu_getopt())和一个参数异常(getopt.GetoptError)。

这里重点介绍getopt.getopt()这个函数。

函数原型:getopt.getopt(args, options[, long_options])

这个函数有三个参数:

  • args:脚本要解析的命令行参数;
  • options:命令行短选项,如果指定的短选项后面需要跟参数的话,要在相应短选项后面加“:”,如e:;
  • long_options:命令行长选项,这个参数是可选的。如果指定的长选项后面要跟参数的话,要在相应长选项后面加上“=”,如conding=;

当给定的命令行参数解析不了的话,就会抛出GetoptError异常。

函数的返回值包含两个元素:

  • 第一个元素是一个(option,value)元组对。Option是解析的参数,value是对应参数的值;
  • 第二个元素是脚本不需要执行的参数列表。也就是这些参数是多余的;

下面看几个Demo:

短选项:

>>> importgetopt
>>> args='-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1','a2']
>>> optlist, args= getopt.getopt(args,'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'),('-d', 'bar')]
>>> args
['a1', 'a2']

长选项:

>>> s='--condition=foo --testing --output-file abc.def -x a1 a2'
>>> args= s.split()
>>> args
['--condition=foo', '--testing','--output-file', 'abc.def', '-x', 'a1', 'a2']
>>> optlist, args= getopt.getopt(args,'x', [
...   'condition=','output-file=','testing'])
>>> optlist
[('--condition', 'foo'), ('--testing', ''),('--output-file', 'abc.def'), ('-x', '')]
>>> args
['a1', 'a2']

在脚本当中经典的应用实例:

importgetopt,sys
 
defmain():
  try:
    opts, args = getopt.getopt(sys.argv[1:],"ho:v", ["help","output="])
  except getopt.GetoptErroras err:
    # print help information and exit:
    printstr(err) # will print something like "option -a not recognized"
    usage()
    sys.exit(2)
  output =None
  verbose =False
  for o, a in opts:
    if o =="-v":
      verbose =True
    elif o in ("-h","--help"):
      usage()
      sys.exit()
    elif o in ("-o","--output"):
      output = a
    else:
      assertFalse,"unhandled option"
  # ...
 
if __name__ =="__main__":
  main()

argparse模块

argparse模块使得编写用户友好的命令行接口非常容易。程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数。argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。
使用argparse模块一般需要三个步骤:

1. 创建一个解析器

使用argparse的第一步是创建一个ArgumentParser对象:

>>> parser= argparse.ArgumentParser()

ArgumentParser对象会保存把命令行解析成Python数据类型所需要的所有信息。

2. 添加参数

通过调用add_argument()方法向ArgumentParser添加程序的参数信息。通常情况下,这些信息告诉ArgumentParser如何接收命令行上的字符串并将它们转换成对象。这些信息被保存下来并在调用parse_args()时用到。例如:

>>> parser.add_argument('--name', help='username')
>>> parser.add_argument('--pass', help='password ')

接下来,调用parse_args()返回的对象将带有两个属性,name和pass。分别保存着用户名与密码。

3. 解析参数

ArgumentParser通过parse_args()方法解析参数。它将检查命令行,把每个参数转换成恰当的类型并采取恰当的动作。在大部分情况下,这意味着将从命令行中解析出来的属性建立一个简单的 Namespace对象。

>>> argments = parser.parse_args(['--name','li','--pass','si'])

在脚本中,parse_args() 调用一般不带参数,ArgumentParser 将根据sys.argv自动确定命令行参数。

ArgumentParser 对象

class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter,prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)

创建一个新的argmentParserr对象。所有的参数应该以关键字参数传递。下面有对每个参数各自详细的描述,但是简短地讲它们是:

  • prog - 程序的名字(默认:sys.argv[0])
  • useage - 描述程序用法的字符串(默认:从解析器的参数生成)
  • description - 参数帮助信息之前的文本(默认:空)
  • epilog- 参数帮助信息之后的文本(默认:空)
  • parents - ArgmentParser 对象的一个列表,这些对象的参数应该包括进去
  • ormatter_class - 定制化帮助信息的类
  • prefix_chars - 可选参数的前缀字符集(默认:‘-‘)
  • fromfile_prefix_chars - 额外的参数应该读取的文件的前缀字符集(默认:None)
  • argument_default - 参数的全局默认值(默认:None)
  • conflict_handler - 解决冲突的可选参数的策略(通常没有必要)
  • add_help - 给解析器添加-h/?help 选项(默认:True)

add_argument() 方法

ArgumentParser.add_argument(nameor flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][,metavar][, dest])

定义应该如何解析一个命令行参数。下面每个参数有它们自己详细的描述,简单地讲它们是:

  • name or flags- 选项字符串的名字或者列表,例如foo 或者-f, --foo。
  • action - 在命令行遇到该参数时采取的基本动作类型。
  • nargs - 应该读取的命令行参数数目。
  • const- 某些action和nargs选项要求的常数值。
  • default - 如果命令行中没有出现该参数时的默认值。
  • type- 命令行参数应该被转换成的类型。
  • choices - 参数可允许的值的一个容器。
  • required - 该命令行选项是否可以省略(只针对可选参数)。
  • help - 参数的简短描述。
  • metavar - 参数在帮助信息中的名字。
  • dest - 给parse_args()返回的对象要添加的属性名称。

总结

以上就是本文关于Python命令行解析模块详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
Python中关键字is与==的区别简述
Jul 31 Python
tensorflow实现简单逻辑回归
Sep 07 Python
Django之无名分组和有名分组的实现
Apr 16 Python
人工神经网络算法知识点总结
Jun 11 Python
Python 进程之间共享数据(全局变量)的方法
Jul 16 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
Django项目中使用JWT的实现代码
Nov 04 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
Python3读写ini配置文件的示例
Nov 06 Python
Python通过Schema实现数据验证方式
Nov 12 Python
python如何修改文件时间属性
Feb 05 Python
python2.7到3.x迁移指南
Feb 01 #Python
Python Paramiko模块的使用实际案例
Feb 01 #Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 #Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 #Python
python通过elixir包操作mysql数据库实例代码
Jan 31 #Python
Django视图和URL配置详解
Jan 31 #Python
Python编程求质数实例代码
Jan 31 #Python
You might like
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
ThinkPHP3.1新特性之多层MVC的支持
2014/06/19 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
python 实现敏感词过滤的方法
2019/01/21 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
Keras模型转成tensorflow的.pb操作
2020/07/06 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
小学门卫岗位职责
2013/12/17 职场文书
煤矿安全生产责任书
2014/04/15 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技