python的内置模块中对于命令行的解析模块共两个getopt 和 optparse 。不过getopt过于简单,往往不能满足需求。此时可以使用optparse模块。这个模块相对于getopt更新,功能更强大。

简单使用

1. 导入模块实例化一个解析器

import optparse
parser = optparse.OptionParser() #实例化一个OptionParse,用来做解析器,可以传参数
optparse.OptionParser(self, prog=None, usage=None, description=None, epilog=None, option_list=None, option_class=, version=None, conflict_handler='error', formatter=None, add_help_option=True):
构造函数__init__(),用于创建一个命令行选项解析器实例;其中,参数:
(1).prog:当前脚本程序的名称;os.path.basename(sys.argv[0]);
(2).usage:描述当前脚本程序的用法字符串;显示该用法之前,格式"%prog"将被格式化成当前脚本程序的名称;
(3).description:当前脚本程序的简单描述、摘要、大纲;它会被显示在命令行选项的帮助之前;
(4).epilog:当前脚本程序的简单描述、摘要、大纲;它会被它会被显示在命令行选项的帮助之后;
(5).conflict_handler:命令行选项冲突处理器;比如,当命令行选项重复时,该如何让处理;可选值:error、resolve;
(6).add_help_option:是否自动生成帮助信息;True:是; False:否; 默认值是True;
(7).option_list:当前脚本程序的命令行选项列表;这个选项列表在standard_options_list中选项添加之后,但是在版本和帮助选项添加之前;可以手工创建该列表,该列表中的元素都使用函数make_option()生成;
例如:option_list=[make_option("-f","--file",action="store",type="string",dest="filename"), ...];
(8).option_class:在使用函数add_option()添加命令行选项到解析器时使用的类;默认为optparse.Option类;
(9).version:打印版本的信息;
(10).formatter:帮助信息格式;有两种格式:IndentedHelpFormatter和TitledHelpFormatter;
其中,参数prog在usage和version中使用格式字符串"%prog"代替os.path.basename(sys.argv[0]);

例如:

parser = optparse.OptionParser("usage%prog" + "-H  -p ")

2.使用OptionParser中的add_option方法添加命令行选项

parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] separated by comma')
optparse.OptionParser.add_option(self, *args, **kwargs):
该函数用于添加命令行选项;参数*args用于传递一个命令行选项的列表;**kwargs用于传递该命令行选项的属性;有几种用法:
(1).parser.add_option(self, optparse.Option):直接添加一个命令行选项类的实例;
(2).parser.add_option(self, option_list):直接添加一个命令行选项列表;option_list=[make_option(), ...];
(3).parser.add_option(*opt_str, ..., kwarg=val, ...);
常用的是第三种;这种用法的函数原型如下:
optparse.OptionParser.add_option(short_option[, long_option], action="store", type="store", dest=None, nargs=1, default=None, help="help text", metavar="");其中,参数:
(1).short_option:短选项字符串;例如,"-f"、"-X";
(2).long_option:长选项字符串;例如,"--file"、"--start";长选项和短选项共同构成可选参数*args或*opt_str;
(3).action:行为字符串;它指示optparse当解析到一个命令行选项时该如何处理;可选值store、store_true、store_false、store_const、append、append_const、count、callback、help、version;默认值是store,表示把命令行参数保存到options对象中;
(4).type:当action的值为存储方式时,type表示存储的数据的类型;有string、int、long、float、complex、choice;
(5).dest:当action的值为存储方式时,dest表示用于存储数据(当前命令行选项附加的参数值)的变量,它会成为函数parse_args()返回的options对象的属性,通过"对象名.属性名"的方式引用;如果不指定dest参数的值,则使用当前命令行选项的长选项名作为dest参数的缺省值和options对象的属性,来存储当前命令行选项的附加参数值;如果当前命令行选项没有指定长选项,则使用短选项名作为dest参数的缺省值和options对象的属性,来存储当前命令行选项的附加参数值;
(6).nargs:指定当前命令行选项应该需要接受的附加参数值的个数;默认值为1;多个参数值之间用空格隔开;当在命令行为该选项输入的附加参数值的个数多于nargs指定的个数时,则值取用前面的nargs个;当在命令行上为该选项输入的附加参数值的个数少于nargs所指定的个数时,则会报错;如果nargs>1,则Python解释器会把这nargs个参数值组装成一个元组(tuple),然后把这个元组传递给当前程序使用;
(7).default:当action的值为存储方式时,default用于指定dest表示的属性变量的缺省值,即,当前命令行选项附加的参数的缺省值;
(8).help:当前命令行选项的帮助、说明信息;
(9).metavar:占位字符串;用于在输出帮助信息时,代替当前命令行选项的附加参数的值进行输出;例如:"-f FILE --file FILE";这个例子中,字符串"FILE"就是metavar的值;
例如:add_oprion("-f", "--file", action="store", type="string", dest="fileName", default="file.txt", help="save host info", metavar="FILE");
当调用parse_args()函数之后,会返回一个options对象,dest参数的值"fileName"将作为options对象的属性名使用,即:options.fileName;同时把当前命令行选项的附加参数值保存在该属性中,即:options.fileName="file.txt";
备注:函数add_option()的各个参数其实就对应着类optparse.Option的对象的每一个属性;

3. 解析命令行参数

(options,args) = parser.parse_args()	#解析命令行
tgtHost = options.tgtHost #获取用户输入的参数
tgtPort = options.tgtPort
(options,args) = optparse.OptionParser.parse_args(self, args=None, values=None):
该函数用于解析命令行参数;其中,参数:
(1).args:用于传递需要被解析的命令行选项列表;默认是sys.argv[1:];
(2).values:用于传递命令行选项的附加参数值的对象;是optparse.Values类的对象;
返回值:是一个包含(options,args)对的tuple;
(1).options:与传递的options或者optparse对象相同,通过optparse创建的实例值;
(2).args:所有被处理的参数之后的剩余参数;

4、optparse.OptionParser.has_option(self, opt_str):
  该函数用于判断OptionParser实例是否有一个名为opt_str的命令行选项;返回值:True-有; False-无;
5、optparse.OptionParser.get_option(self, opt_str):
  该函数用于获取命令行选项opt_str的实例;若没有该选项,则返回None;
6、optparse.OptionParser.remove_option(self, opt_str):
  该函数用于移除命令行选项opt_str;若OptionParser对象中存在命令行选项opt_str,则移除,否则抛出ValueError异常;若存在多个opt_str的选项,则所有相关的选项都变成无效;
7、optparse.OptionParser.destroy():
  该函数用于销毁OptionParser对象实例;

例子:

parse = optparse.OptionParser("usage: python3 zip_file_crack.py " + "-f  -d ")
parse.add_option('-f', dest='zip_name', type='string', help='specify zip file')
(options, args) = parse.parse_args()
if (options.zip_name == None) or (options.dict_name == None):
print(parse.usage)
exit(0)
else:
zip_name = options.zip_name
dict_name = options.dict_name

选项行为

action的取值:
    store:表示把命令行参数值保存到options对象中,即,保存到dest参数值代表的变量中;
    store_true:用于处理命令行选项不带附加参数值的情况,该选项类似于一个开关,保存真值True;
    store_false:用于处理命令行选项不带附加参数值的情况,该选项类似于一个开关,保存假值False;
    store_const:保存一个常量值到dest参数值代表的变量中,常量值由const参数指定;
    append:保存/追加这个选项的参数到一个列表中;
    append_const:保存/追加这个选项的参数到一个列表中,常量值由const参数指定;
    count:把一个计数器递增1;
    callback:调用一个指定的函数;

冲突处理

当设定的命令行选项冲突时,用于处理该冲突的一种机制;比如:不小心把两个或多个命令行选项设置成相同的导致冲突的选项字符串;比如:
    parser.add_option("-n", "--dry-run", ...);
    parser.add_option("-n", "--noisy", ...);
指定冲突处理器的方法:
    1、在OptionParser的构造函数中通过参数指定:OptionParser(conflict_handler=handler);
    2、通过调用OptionParser对象的set_conflict_handler()指定:OptionParser.set_conflict_handler(handler);
    可用的冲突处理器有:error和resolve;默认是error;
        erro:冲突时触发异常OptionConflictError;
        resolve:冲突时智能解决;

选项属性

optparse.Option类的属性如下:
Option.action:定义命令行选项的行为;缺省值"store";
Option.type:定义选命令行项附加参数的类型;缺省值"string";
Option.dest:定义一个变量名称,用于保存命令行选项附加参数的值;该变量会变成options对象的属性;
Option.default:定义命令行选项附加参数值的缺省值;
Option.nargs:一个单一的命令行选项所附加的参数值的个数;
Option.const:作为action属性的值,用于指定保存的数据为常量;
Option.choices:作为type属性的值,用于指定从字符串列表中选择一个类型;
Option.callback:作为action的属性值,用于指定命令行选项的参数是一个可调用的对象或函数; <<<<-----待验证;
Option.callback_args:以元组结构为Option.callback属性所指定的可调用对象或函数传递可选参数;(*args)
Option.callback_kwargs:以字典结构为Option.callback属性所指定的可调用对象或函数传递可选参数;{key:val}
Option.help:帮助文本;such as --help/-h;若要隐藏该选项,可使用值optparse.SUPPRESS_HELP;
Option.metavar:命令行选项的附加参数值的占位符;用于打印帮助信息时,替代命令行选项的附加参数值进行输出;

回调函数

当Option的属性action的值为"callback"时,就要为add_option()函数传递callback参数的值了;此时,该选项就是一个命令选项,它可以单独执行一个功能,调用一个具体的函数,而参数callback就是用于指定需要调用的函数;如果,这个将要被调用的函数需要参数,则还要为函数add_option()传递callback_args参数或callback_kwargs参数,以方便为这个将要被调用的函数传递元组的参数或字典参数;例如:

  parser.add_option("opt_str", action="callback", callback=, default=None, metavar="FUNC");
parser.add_option(opt_str, action="callback", callback=, callback_args=(), callback_kwargs={}, nargs=1, default=None, metavar="FUNC");
callback函数的最小定义格式如下:最小格式不接艘参数
def func_name(option, opt_str, value, parser):
pass;
callback函数的最大定义格式如下: 最大格式接收参数
def func_name(option, opt_str, value, parser, *args, **kwargs):
pass;

python optparser模块的更多相关文章

  1. Kemaswill 机器学习 数据挖掘 推荐系统 Python optparser模块简介

      Python optparser模块简介

  2. optparser模块 与 ZIP爆破(Python)

    optparser模块: 为脚本传递命令参数. 初始化: 带 Usage 选项(-h 的显示内容 Usage:): >>> from optparse import OptionPa ...

  3. python相似模块用例(一)

    一:threading VS Thread 众所周知,python是支持多线程的,而且是native的线程,其中threading是对Thread模块做了包装,可以更加方面的被使用,threading ...

  4. optparser 模块 提取IP,端口,用户名,密码参数模板

    import optparse #class FtpClient(object): #自定义类可以自己修改 '''ftp客户端''' #def __init__(self): parser = opt ...

  5. Python标准模块--threading

    1 模块简介 threading模块在Python1.5.2中首次引入,是低级thread模块的一个增强版.threading模块让线程使用起来更加容易,允许程序同一时间运行多个操作. 不过请注意,P ...

  6. Python的模块引用和查找路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...

  7. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  8. Python标准模块--logging

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

  9. python基础-模块

    一.模块介绍                                                                                              ...

随机推荐

  1. Linux 修改时间和时区为上海时区

    发现centos7的时间是utc的,和上海时间不一样. 由于/usr/share/zoneinfo/Asia/  这个目录下没有北京时区,就选择了上海时区,只要赋值过去就可以了 rm -f /etc/ ...

  2. Oracle 一个用户将表权限赋给另一个用户

    原文地址:https://blog.csdn.net/u012129031/article/details/76218764 1.将用户user1的表权限赋给用户user2 select   'gra ...

  3. 我的微信小程序第一篇(入门)

    前言 微信小程序出来已经有一段时间了,已经有很多大牛都写过相关教程了,那么我为啥还要写这篇文章呢?其实仅仅是个人对微信开发的一个兴趣吧,觉得是个很有意思的事情,后面有时间可能会发更多关于小程序的文章, ...

  4. python之面向对象3

     面向对象介绍 一.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点 ...

  5. Windows下如何更新 CodeBlocks 中的 MinGW 使其支持新版本 C++

    转自:http://blog.csdn.net/wtfmonking/article/details/17487705 虽然 CodeBlocks16.01 已经是最新版了,但其中的 MinGW 仍然 ...

  6. 如何利用mui实现底部选择器(含日期选择器)?

    1.第一步: 项目中应该引入相应的css和js文件,相关文件可到mui官网查询. <link rel="stylesheet" type="text/css&quo ...

  7. python_超级基础

    初识计算机 CPU 计算机的大脑.中央处理单元,主要负责数据运算及计算,是运算计算中心. 存储器 内存 临时存储数据,供CPU运算使用. 优点: 读取速度快. 缺点: 容量小,成本高,断电即消失. 硬 ...

  8. MySQL 遇到的问题以及解决方案

    Problem: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysq ...

  9. 【问题解决方案】editplus中批量将ANSI转换为utf-8

    来自一个用editplus写java程序但是上传到GitHub里中文乱码的故事 大致步骤: editplus全部打开之后(打开为何种编码不重要): (全部打开是指在左下方的文件列表选中-->右击 ...

  10. 解决sqoop连接mysq错误

    一.问题描述 1.由于当前集群没有配置Zookeeper.hcatalog.accumlo,因此应该在sqoop的配置文件中注释掉判断Zookeeper.hcatalog.accumlo路径是否正确的 ...