Table Of Contents

Previous topic

PyMOTW: shelve

Next topic

PyMOTW: shutil

This Page

PyMOTW: optparse

  • 模块:optparse
  • 目的:命令行参数解析, 可以取代getopt
  • python版本:2.3

描述

optparse是一个当前可选的命令行解析模块, 它提供了一些在getopt中不含有的特性, 如type conversion(类型转换), option callbacks(参数回调)以及automatice help generation(自动化帮助生成). 本文没有详细介绍optparse的很多特性, 但它可以帮助你在写命令行程序时能够快速入门.

创建一个OptionParser

optparser解析参数需要经过2个阶段. 首先, 构建OptionParser实例并配置相关的选项, 然后填入一个参数序列并处理.

import optparse
parser = optparse.OptionParser()

通常, 一旦分析器被建立, 每一个选项需要明确的添加到parser中, 并说明当命令行遇到相关的选项时需要如何处理. 在构建OptionParser时也可以传入一个选项列表, 但这种形式不经常使用.

定义选项

利用add_option()方法可以每次增加一个选项. 在参数列表的开始, 任何未命名的字符串参数都将被视为选项名. 如果要为一个选项创建别名, 比如为同一个选项增加一个短的或长的命名, 那么简单传递同名字符串即可.

不同于getopt, 只能分析选项, optparse是一个完整的选项分析库, Option(选项)可以被不同的方法处理, 通过在add_option()方法中指定action(行为)参数. 支持的行为包括存储参数(单独或作为列表的一部分), 当一个选项出现时(包括对布尔开关true/false的特殊处理)存储其常量值, 计算一个选项出现的次数以及调用一个callback(回调函数).

默认的行为是存储这个选项的参数. 如果给定了type(类型), 那么在存储前, 这个参数值将被转化成这个类型. 如果给定了dest(目标参数), 那么当命令行参数被解析时, 选项值被存储在该选项对象的dest中.

分析一个命令行

一旦所有的选项被定义好, 命令行被作为一个参数字符串传递给parse_args()方法. 一般, 参数可以从sys.argv[1:]中得到, 当然你可以传递自己的列表. 选项处理时使用GNU/POSIX语法, 因此, 选项和参数值可以在参数序列中混合使用.

从parse_args()方法返回的是一个二维元组, 包含一个optparse Values实例和在命令行中未被解析的参数列表. Values实例将选项值作为属性, 如果你定义了一个选项的dest为”myoption”, 可以通过option.myoption访问该选项的值.

简单示例

如下一个简单例子有三个不同的选项, 一个布尔选项(-a), 一个字符串选项(-b)和一个整型选项(-c).

import optparse
parser = optparse.OptionParser()
parser.add_option('-a', action="store_true", default=False)
parser.add_option('-b', action="store", dest="b")
parser.add_option('-c', action="store", dest="c", type="int")
print parser.parse_args(['-a', '-bval', '-c', '3'])

命令行中选项解析的规则和getopt.gnu_getopt()一样, 因此有两种方法传递单字符串选项的值, 上述示例使用了两种方法-bval和-c val.

$ python optparse_short.py
(<Values at 0xe29b8: {'a': True, 'c': 3, 'b': 'val'}>, [])

注意, c所关联的值的类型是整型, OptionParser在存储之前会转换成指定类型. 不同于getopt, optparse处理长选项名时和短选项名是没有任何区别的.

parser = optparse.OptionParser()
parser.add_option('--noarg', action="store_true", default=False)
parser.add_option('--witharg', action="store", dest="witharg")
parser.add_option('--witharg2', action="store", dest="witharg2", type="int")
print parser.parse_args([ '--noarg', '--witharg', 'val', '--witharg2=3' ])

结果相同的:

$ python optparse_long.py
(<Values at 0xd3ad0: {'noarg': True, 'witharg': 'val', 'witharg2': 3}>, [])

与getopt的比较

如下实现一个与getopt之前示例相同功能的optparse例子:

import optparse
import sys
print 'ARGV      :', sys.argv[1:]
parser = optparse.OptionParser()
parser.add_option('-o', '--output',
            dest="output_filename",
            default="default.out",
            )
parser.add_option('-v', '--verbose',
            dest="verbose",
            default=False,
            action="store_true",
            )
parser.add_option('--version',
            dest="version",
            default=1.0,
            type="float",
            )
options, remainder = parser.parse_args()
print 'VERSION   :', options.version
print 'VERBOSE   :', options.verbose
print 'OUTPUT    :', options.output_filename
print 'REMAINING :', remainder

注意, -o和–output选项是如何在同一时刻被定义的, 命令行中可以使用任何一种选项.

$ python optparse_getoptcomparison.py -o output.txt
ARGV      : ['-o', 'output.txt']
VERSION   : 1.0
VERBOSE   : False
OUTPUT    : output.txt
REMAINING : []
$ python optparse_getoptcomparison.py --output output.txt
ARGV      : ['--output', 'output.txt']
VERSION   : 1.0
VERBOSE   : False
OUTPUT    : output.txt
REMAINING : []

另外, 长选项名的唯一前缀也可以被使用.

$ python optparse_getoptcomparison.py --out output.txt
ARGV      : ['--out', 'output.txt']
VERSION   : 1.0
VERBOSE   : False
OUTPUT    : output.txt
REMAINING : []

Option Callbacks(选项回调)

除了直接为选项存储参数, 另一种选择是定义callback function, 当命令行中出现该选项时调用, 选项的callbacks有4个参数, 分别是引起callback的optparse.Option实例, 命令行中的选项字符串, 选项关联的参数值以及处理解析工作的optparse.OptionParser实例.

import optparse

def flag_callback(option, opt_str, value, parser):
    print 'flag_callback:'
    print '\toption:', repr(option)
    print '\topt_str:', opt_str
    print '\tvalue:', value
    print '\tparser:', parser
    return

def with_callback(option, opt_str, value, parser):
    print 'with_callback:'
    print '\toption:', repr(option)
    print '\topt_str:', opt_str
    print '\tvalue:', value
    print '\tparser:', parser
    return

parser = optparse.OptionParser()
parser.add_option('--flag', action="callback", callback=flag_callback)
parser.add_option('--with',
    action="callback",
    callback=with_callback,
    type="string",
    help="Include optional feature")
parser.parse_args(['--with', 'foo', '--flag'])

在这个例子中, –with选项被配置成处理字符串参数(当然, 其他类型也是同样支持的).

$ python optparse_callback.py
with_callback:
     option: <Option at 0x78b98: --with>
     opt_str: --with
     value: foo
     parser: <optparse.OptionParser instance at 0x78b48>
flag_callback:
     option: <Option at 0x7c620: --flag>
     opt_str: --flag
     value: None
     parser: <optparse.OptionParser instance at 0x78b48>

帮助信息

OptionParser自动为每个选项集合包含一个help选项, 因此, 用户在运行程序时在命令行输入–help来看介绍, 帮助信息为所有选项指示它们是否需要传入一个参数, 也可以通过在add_option()中定义帮助文本来为一个选项定义更多的描述.

parser = optparse.OptionParser()
parser.add_option('--no-foo', action="store_true",
    default=False,
    dest="foo",
    help="Turn off foo",
)
parser.add_option('--with', action="store", help="Include optional feature")
parser.parse_args()

选项按字母顺序显示, 别名显示在同一行, 当选项带有一个参数时, dest值将作为参数名字出现在help输出中, 帮助信息将出现在这列中.

$ python optparse_help.py --help
Usage: optparse_help.py [options]

Options:
-h, --help   show this help message and exit
--no-foo     Turn off foo
--with=WITH  Include optional feature

利用nargs选项可以配置callbacks接收多个参数.

def with_callback(option, opt_str, value, parser):
    print 'with_callback:'
    print '\toption:', repr(option)
    print '\topt_str:', opt_str
    print '\tvalue:', value
    print '\tparser:', parser
    return

parser = optparse.OptionParser()
parser.add_option('--with',
    action="callback",
    callback=with_callback,
    type="string",
    nargs=2,
    help="Include optional feature")
parser.parse_args(['--with', 'foo', 'bar'])

在这个例子中, 参数作为一个元组传递给callback function的value参数.

$ python optparse_callback_nargs.py
with_callback:
     option: <Option at 0x7c4e0: --with>
     opt_str: --with
     value: ('foo', 'bar')
     parser: <optparse.OptionParser instance at 0x78a08>