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 相关文章推荐
Python计算程序运行时间的方法
Dec 13 Python
Python文件和目录操作详解
Feb 08 Python
Python常见格式化字符串方法小结【百分号与format方法】
Sep 18 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
Oct 14 Python
python global和nonlocal用法解析
Feb 03 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
Mar 20 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
Python创建文件夹与文件的快捷方法
Dec 08 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 Python
基于Python实现股票收益率分析
Apr 02 Python
如何Python使用re模块实现okenizer
Apr 30 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
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
Vue官网todoMVC示例代码
2018/01/29 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
中间件分为哪几类
2016/09/18 面试题
初中校园之声广播稿
2014/01/15 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
2014年元旦感言
2014/03/06 职场文书
继承公证书样本
2014/04/04 职场文书
大学生简短的自我评价
2014/09/12 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL
Golang 切片(Slice)实现增删改查
2022/04/22 Golang