Python2.7 标准库 optparse 强大的命令行参数解析器

来源:互联网 发布:搜狗高速浏览器mac版 编辑:程序博客网 时间:2024/05/18 01:21

标准库名为optparse,在官方文档中对optparse的描述是:一个强大的,扩展性强的,易用的命令行参数解析工具。附上官方文档中的使用实例:

from optparse import OptionParser    parser = OptionParser()parser.add_option("-f", "--file", dest="filename",                  help="write report to FILE", metavar="FILE")parser.add_option("-q", "--quiet",                  action="store_false", dest="verbose", default=True,                  help="don't print status messages to stdout")(options, args) = parser.parse_args()
调用程序如下:
<yourscript> --file=outfile -q
optparse库中共定义了13个类,如下图所示,缩进代表的是继承关系,如BadOptionError类继承自OptParseError类。其中5个类用于处理命令行中会出现的错误。如输入不存在的命令参数,命令行参数之间存在冲突等等,3个类用于处理帮助信息的输出格式,在此不仔细说明。接下来主要介绍3个类的内容及使用方法。
exceptions.Exception(exceptions.BaseException)    OptParseError        BadOptionError        OptionError            OptionConflictError            OptionValueErrorHelpFormatter    IndentedHelpFormatter    TitledHelpFormatterOptionOptionContainer    OptionGroup    OptionParserValues
首先从OptionParser说起,它是对命令行解析的最主要的类,想要读取解析命令行参数,首先要创建一个OptionParser类的实例:
from optparse import OptionParserparser = OptionParser()
OptionParser类的属性及默认值如下:
parser = OptionParser(usage="%prog [options]", version=None, description=None, conflict_handler="error",              add_help_option=True, prog=os.path.basename(sys.argv[0]), epilog=None,               formatter=IndentedHelpFormatter, option_list=[], option_class=optparse.Option)
详细介绍:
OptionParser.usage: 程序的使用信息。当调用程序帮助时显示的帮助信息,一般是显示在最前面,默认值为“%prog [options] version=None”,其中的%prog类似于一个隐式的格式化字符串,默认值为sys.argv[0],也就是调用的程序名称。这个%prog也可以用在description参数中。
OptionParser.version : 程序的版本信息。默认为None,如果提供参数,会自动生成 --version 命令参数,可以直接程序名加--version就能看到这个信息。
OptionParser.description: 程序的功能信息。默认为None,显示帮助信息时,显示在usage之后,options之前。
OptionParser.prog: 用于usage,description中%prog的显示,默认为程序名称,可以自己修改参数。
OptionParser.epilog: 程序的附加信息。默认为None显示帮助信息时,显示在options之后。
OptionParser.formatter: 程序帮助信息的显示格式,默认为IndentedHelpFormatter。
OptionParser.add_help_option:程序帮助信息显示开关。默认为True,会自动给程序添加-h和--help命令参数,以显示帮助信息。改为False,则此命令不可用。
以上的参数是对程序本身的描述信息,有助于用户更好地理解和使用程序。
OptionParser.conflict_handler:对冲突的处理方式,默认为返回错误“error”。还有“resolve”,智能解决冲突。当用户给程序添加了两个一样的命令参数时,“error”就直接报错,提醒用户。而“resolve”则会去掉第一次出现的命令参数重复的部分或者全部(可能是短命令冲突或者全都冲突)。
OptionParser.option_list:包含Option实例的列表,若提供参数,则在产生实例时根据此列表进行初始化。
OptionParser.option_class:命令参数所属类,默认为Option,可编写其他类将其覆盖。
使用默认参数:
from optparse import OptionParser as opparser = op()parser.print_help()
输出结果:
Usage: testoptparse2.py [options]Options:  -h, --help  show this help message and exit
无参数的OptionParser实例的帮助信息只有usage和因为add_help_option为True而自动生成的--help命令参数。
添加参数:
from optparse import OptionParser as opparser = op(usage="%prog -v [options] [files]", version=1.02, description="%prog is a test file",            add_help_option=False, prog="testfile", epilog="ps:please be careful with it.")parser.print_help()
输出结果:
Usage: testfile -v [options] [files] #usagetestfile is a test file #descriptionOptions: #options  --version  show program's version number and exitps:please be careful with it. #epilog
参数说明:
1. prog被修改成了testfile,所以usage和description中的%prog跟着改变了。
2. 给version提供了参数,所以自动生成了--version命令参数。
3. 给description和epilog参数提供参数,显示在了合适的位置。
4. add_help_option被设置成False,所以程序没有--help命令参数,但是这样很不友好,所以一般不改动。

OptionParser类的方法众多,其中最为重要的是add_option()方法,它是给程序添加命令参数的方法,从函数名很容易知道,它接受的参数是Option类的一个实例,调用方法如下:
from optparse import OptionParser as opfrom optparse import Optionparser = op()option = Option('-r')parser.add_option(option)parser.print_help()
输出结果:
Usage: testoptparse2.py [options]Options:  -h, --help  show this help message and exit  -r R 
可以看到,一个-r的命令参数添加到了程序当中,此例创建了一个最简单的Option类,所以命令参数帮助信息比较简单。add_option参数除了接受Option类的实例外,还接受分开的实例参数。可以理解成add_option接受分开的参数后,先用这些参数实例化一个Option类,然后把它添到parser中。调用如下:
parser.add_option('-r')
输出的结果和上述的一样。所以为了清楚地了解add_option的参数,首先来介绍一下Option类。
Option类是对于每个命令参数的封装,它的属性如下:
option = Option(action="store", type="string", dest, default, nargs=1, choices,                 help, metavar, const, callback, callback_args, callback_kwargs)
详细介绍:
Option.dest:先从这个最有意思的说起。dest是destination的简写。它是命令行参数的去向。例如执行-r file ,当action为“store”时,跟在-r后面的file就被保存在dest中了。后续就能调用了。如果没有提供dest参数,程序会自动根据命令参数得到dest,例如,对于短参数 -r file,dest=r,对于长参数 --read,dest=read,对于--read-top,dest=read_top,如果两种参数都有,长参数优先。感觉有些古怪,所以一般还是提供一个有意义的参数名比较好。
Option.default:提供默认参数值。需要特别注意,这个默认值是赋给dest的,跟命令参数没有任何关系。即使命令参数不提供,dest仍会存在。
Option.nargs:命令参数需要的参数数量,默认为1,若大于1,返回元组给dest。
Option.type:将用户提供的参数转换成type。共六种类型,int,long,string,float,complex,choice,其中string是默认类型。complex是复数类型,如果choices提供了参数的话,type类型默认为choices。
Option.choices:限制用户的输入。choices是一个字符串的列表,包含所有用户能用的输入。如提供choices=[‘1’,‘2’,‘3’],那么用户只能输入1,2,3中的一个,如果不符,会抛出异常。这个参数在某些时候极为有用。
Option.help:为该命令参数提供注释。
Option.action:对命令行参数的操作。这是最为核心的属性。它是在接收到命令行参数时,对参数进行的操作。默认是“store”,也就是储存,当接收到参数后,把它存进dest中。操作很多,如:
“store”: 把参数存进dest。
“store_const”:这个操作和const参数配套使用,检测到命令参数后就把const存进dest。
“store_true”:store_const的特例,存的是bool值 True。
“store_false”:存bool值false。
“append”:将参数追加进dest列表,如果dest列表不存在,就创建一个空列表,然后把参数存进去。
“append_const”:和store_const类似,将const参数追加到dest,dest是列表。
“count”:发现一个匹配的命令参数,dest的值加一,默认从零开始。
“help”:把parser的help打印出来。
“version”:显示版本信息,一般有了help,就不用version。
使用实例:
from optparse import OptionParser as opfrom optparse import Optionparser = op()option = Option("-r", "--read", action="append", default="hello, world",                nargs=3, help="try to get the tuple.")parser.add_option(option)parser.print_help()
输出结果:
Usage: testoptparse2.py [options]Options:  -h, --help            show this help message and exit  -r READ, --read=READ  try to get the tuple.
Option还有一些方法,在此不介绍了。
需要明确的是,上面讲的Option类,它的一个实例只是parser的一个命令参数。add_option()方法可以直接用分散的参数代替Option实例。如:
from optparse import OptionParser as opfrom optparse import Optionparser = op()parser.add_option('-r', "--read", action="append", default="hello, world",                nargs=3, help="try to get the tuple.")parser.print_help()
结果和上面是一样的。
OptionParser其他的一些方法:
set_usage(usage):重新设置usage的内容。
print_usage(file=None):把usage的内容打印到file中,默认为stdout。
get_usage():返回usage内容。
print_version(file=None):把version信息打印到file中,默认为stdout。
get_version():返回version内容。
set_defaults(dest=value):把所有options同一个dest初始化为value。
make_option(*parameters):把分散的参数转成Option实例,和OptionParser.option_list配合使用,实现初始化。有利于程序管理。
add_option_group(optiongroup):添加参数组(OptionGroup实例)。

OptionGroup类是用来给参数分组的,它也会被包含在OptionParser实例中。初始化如下:
from optparse import OptionParserfrom optparse import OptionGroupparser = OptionParser()group = OptionParser(parser, title, description=None)group.add_option('-r')parser.add_option_group(group)
参数分组是为了让程序更加清晰,在管理和修改方面比较方便。同时方便用户对程序参数的理解。但对于程序的运行没有意义。

OptionParser的parse_args()方法是程序获得命令行参数的方法,使用如下:
# 提供参数列表,各个参数之间要分开(options, args) = parser.parse_args(['-r', '42', '-h'])# 从命令行读取参数(options, args) = parser.parse_args()
parser返回两个值:
options:存的是你所有option的值,option.dest调用该值,命令行参数未提供则为默认值。
args:除开option需要的值,命令行参数还剩下的值,也就是程序运行所必须的参数。
特别注意,当函数接受到-h,--help,--version时,程序会返回相应的信息然后退出,不会进行后续操作了。

综合使用例子(摘自官方文档):
from optparse import OptionParserfrom optparse import OptionGroupfrom optparse import Optionusage = "usage: %prog [options] arg1 arg2"parser = OptionParser(usage=usage)parser.add_option("-v", "--verbose",                  action="store_true", dest="verbose", default=True,                  help="make lots of noise [default]")parser.add_option("-q", "--quiet",                  action="store_false", dest="verbose",                  help="be vewwy quiet (I'm hunting wabbits)")parser.add_option("-f", "--filename",                  metavar="FILE", help="write output to FILE")parser.add_option("-m", "--mode",                  default="intermediate",                  help="interaction mode: novice, intermediate, "                       "or expert [default: %default]")group = OptionGroup(parser, "Dangerous Options",                    "Caution: use these options at your own risk.  "                    "It is believed that some of them bite.")group.add_option("-g", action="store_true", help="Group option.")parser.add_option_group(group)group = OptionGroup(parser, "Debug Options")group.add_option("-d", "--debug", action="store_true",                 help="Print debug information")group.add_option("-s", "--sql", action="store_true",                 help="Print all SQL statements executed")group.add_option("-e", action="store_true", help="Print every action done")parser.add_option_group(group)parser.print_help()
输出结果:
Usage: testoptparse.py [options] arg1 arg2Options:  -h, --help            show this help message and exit  -v, --verbose         make lots of noise [default]  -q, --quiet           be vewwy quiet (I'm hunting wabbits)  -f FILE, --filename=FILE                        write output to FILE  -m MODE, --mode=MODE  interaction mode: novice, intermediate, or expert                        [default: intermediate]  Dangerous Options:    Caution: use these options at your own risk.  It is believed that some    of them bite.    -g                  Group option.  Debug Options:    -d, --debug         Print debug information    -s, --sql           Print all SQL statements executed    -e                  Print every action done

以上对于optparse的介绍,仅仅停留在表面,对于一些更深的东西,在此就不多谈了。官方文档第一句话是:optparse从2.7版本后就被弃用了,现在转战argparse吧!
嗯……
多学学总没错,就这样安慰自己。










阅读全文
0 0