2.[Python]使用optparse快速开发命令行解释程序

转载请注明原始出处:http://blog.csdn.net/a464057216/article/details/47375999
如果您使用的Python版本>=2.7,推荐使用argparse模块。

后续此博客不再更新,欢迎大家搜索关注微信公众号“测开之美”,测试开发工程师技术修炼小站,持续学习持续进步。
在这里插入图片描述

简介

要开发一套命令行接口,可以自己从无到有写一套处理输入输出的各种可能的复杂情况的代码出,然而工作中为了提高工作效率,也可以采用一些现成的命令行开发工具。optparse模块是Python中用来编写命令行工具的包,尤其是其中的OptionParser类非常好用,下面我们来一起学习一下。
使用OptionParser类的流程是:

1.建立一个OptionParser类的实例作为命令行解析器。
2.使用创建的解析器定义命令行的格式、帮助信息等等。
3.从用户输入中获取命令行的对应信息并使用。

下面按顺序介绍OptionParser的使用方法。

建立解析器

optparse.OptionParser类创建时可以不提供任何参数,不过标准库为我们提供了很多有用的参数可以初始化很多有用的信息,使用这些参数时最好采用关键字赋值的方法,不然依赖位置参数的顺序很容易混乱。

  • usage参数:默认值是'%prog [options]',用于在命令行解析出错或者显示帮助信息时使用,例如:
import optparse
usage = '''
cmdtest.py -h | --help
SAMPLE: python cmdtest.py -h'''

parser = optparse.OptionParser(usage = usage)
parser.print_help()

执行结果:

mars@mars-Ideapad-V460:~/test$ python cmdtest.py -h
Usage: 
cmdtest.py -h | --help
SAMPLE: python cmdtest.py -h

Options:
  -h, --help  show this help message and exit

如果不给usage赋值,usage的默认值中的prog就会被展开为os.path.basename(sys.argv[0])(或者也可以给prog参数赋值),例如:

parser = optparse.OptionParser()

执行结果:

mars@mars-Ideapad-V460:~/test$ python cmdtest.py -h
Usage: cmdtest.py [options]

Options:
  -h, --help  show this help message and exit

为prog参数赋值:

parser = optparse.OptionParser(prog = 'cmdtest')

执行结果:

mars@mars-Ideapad-V460:~/test$ python cmdtest.py -h
Usage: cmdtest [options]

Options:
  -h, --help  show this help message and exit

如果不想显示usage部分,可以给usage赋值optparse.SUPPRESS_USAGE:

parser = optparse.OptionParser(usage = optparse.SUPPRESS_USAGE)

执行结果:

mars@mars-Ideapad-V460:~/test$ python cmdtest.py -h
Options:
  -h, --help  show this help message and exit
  • option_list参数:由option实例组成的列表,它们定义了命令行格式的构成,具体使用方法参见后面的add_option部分。
  • option_class参数:定义向解析器用add_option方法添加选项时采用的类,一般采用默认的optparse.Option类就行,或者自己重新定义一个。
  • version参数:如果使用这个参数,生成的命令行会增加一个--version参数,例如python --version可以显示命令行的版本,这个参数可以使用prog参数,如:
parser = optparse.OptionParser(version = '%prog 1.0',
                               prog = 'cmdtest')

执行结果(add_option以后的结果,不add_option的话--version不好使):

mars@mars-Ideapad-V460:~/test$ python cmdtest.py --version
cmdtest 1.0
  • descripiton参数:用于简洁的描述命令行的作用,位置位于usage和option list的显示之间,例如:
parser = optparse.OptionParser(description = 'This is a description test')

执行结果:

mars@mars-Ideapad-V460:~/test$ python cmdtest.py -h
Usage: cmdtest.py [options]

This is a description test

Options:
  -h, --help  show this help message and exit
  • add_help_option参数:默认为True,会自动生成一个-h选项打印帮助信息。如果赋值为False,则不会生成-h选项,例如:
parser = optparse.OptionParser(add_help_option = False)

执行结果:

mars@mars-Ideapad-V460:~/test$ python cmdtest.py -h
Usage: cmdtest.py [options]

mars@mars-Ideapad-V460:~/test$ python cmdtest.py 
Usage: cmdtest.py [options]
  • prog参数:用于替换version和usage里面的prog。
  • epilog参数:用于对各个选项参数做一个简短的说明,显示位置位于option list下面,例如:
parser = optparse.OptionParser(epilog = 'The -h option is used to print a help message and exit.')

执行结果:

mars@mars-Ideapad-V460:~/test$ python cmdtest.py -h
Usage: cmdtest.py [options]

Options:
  -h, --help  show this help message and exit

The -h option is used to print a help message and exit.

定义命令行的构成

定义命令行的构成有多种方法,标准库推荐的做法是使用optparse.OptionParser.add_option方法。add_option有两种调用方法,一种是以optparse.make_option返回的optparse.option实例做为参数,另一种是传入能够作为make_option方法的参数的参数,如各种位置参数和关键字参数等。
另一种方法是定义解析器变量时采用option_list参数,例如:

parser = optparse.OptionParser(option_list = [
    optparse.make_option('-n', '--name', dest = 'name', action = 'store')
])

执行结果:

mars@mars-Ideapad-V460:~/test$ python cmdtest.py -h
Usage: cmdtest.py [options]

Options:
  -n NAME, --name=NAME
  -h, --help            show this help message and exit

注意,定义option时出错会引发optparse.OptionError异常。
下面详细解释add_option的各种参数(也就是make_option的各种参数),首先是基本格式:
i)OptionParser.add_option('-o', attr = value, ...)【短格式】
ii)OptionParser.add_option('--option', attr = value, ...)【长格式】
只定义短格式或者长格式命令时用上面任何一种格式,长短格式都定义时,长格式和短格式的顺序无所谓。attr的属性列表可以定义一个选项的各种属性,如action、dest、type等等。

  • action属性:
    action属性定义解析器遇到命令行中该选项时的行为,包括:
  • store(默认)[相关atrr: type、dest、nargs、choices]:该选项后必须跟一个值,将会转化为type类型存储至dest,如果值的个数大于1,可以用nargs指定(此时存储为元组格式)。如果提供了choices参数,type默认为choice,否则type的默认值是string。如果dest未提供,将先从长格式选项名自动生成(如--option-name生成option_name),如果没有长格式名则从短格式名自动生成(如-o生成o)。举个例子:
parser = optparse.OptionParser()
parser.add_option('-v', '--values', nargs = 2, type = 'int')
(options, args) = parser.parse_args()
print 'options:',options
print 'sum:', options.values[0] + options.values[1]

执行结果:

mars@mars-Ideapad-V460:~/test$ python sum.py -v 23 45
options: {'values': (23, 45)}
sum: 68
  • store_const[相关atrr: dest、const]:使用store_const时不需要为选项提供值,通常用于程序做不同的逻辑判断,例如:
parser = optparse.OptionParser()
parser.add_option('-c', '--child', dest = 'age', action = 'store_const', const = 0)
parser.add_option('-a', '--adult', dest = 'age', action = 'store_const', const = 1)
parser.add_option('-e', '--elder', dest = 'age', action = 'store_const', const = 2)

age_list = ['child', 'adult', 'elder']
(options, args) = parser.parse_args()

print 'You are a(an)', age_list[options.age]

执行结果:

mars@mars-Ideapad-V460:~/test$ python age.py -c
You are a(an) child
mars@mars-Ideapad-V460:~/test$ python age.py -a
You are a(an) adult
mars@mars-Ideapad-V460:~/test$ python age.py -e
You are a(an) elder
  • store_true[相关atrr: dest]:跟store_const类似,但是它存储一个布尔型真值。
  • tore_false[相关atrr: dest]:存储一个布尔型假值,例如:
parser = optparse.OptionParser()
parser.add_option('-s', '--silent', dest = 'mode', default = True, action = 'store_true')
parser.add_option('-v', '--verbose', dest = 'mode', action = 'store_false')

(options, args) = parser.parse_args()
if options.mode:
    print 'You are in silent mode'
else:
    print 'You are in verbose mode'

执行结果:

mars@mars-Ideapad-V460:~/test$ python sorq.py
You are in silent mode
mars@mars-Ideapad-V460:~/test$ python sorq.py -s
You are in silent mode
mars@mars-Ideapad-V460:~/test$ python sorq.py -v
You are in verbose mode
  • append[相关attr:type、dest、nargs、choices]:与store功能类似,不过append将选项的参数值append到dest指向的列表上。例如:
parser = optparse.OptionParser()
parser.add_option('-a', '--append', dest = 'books', action = 'append', default = ['book1'])

(options, args) = parser.parse_args()
print 'books:',options.books

执行结果:

mars@mars-Ideapad-V460:~/test$ python appendtest.py -a book2
books: ['book1', 'book2']
  • append_const[相关attr:dest、const]:与store_const功能类似。
  • count[相关attr:dest]将dest计数器加一,如果default值未提供,将dest初始化为0再加一。例如:
parser = optparse.OptionParser()
parser.add_option('-i', '--increment', dest = 'value', action = 'count', default = 3)

(options, args) = parser.parse_args()
print 'value:',options.value

执行结果:

mars@mars-Ideapad-V460:~/test$ python counttest.py -i
value: 4
  • callback-调用回调函数
  • help:打印帮助信息,这些帮助信息由解析器建立时的usage参数及每个optiopn的help参数提供,如果不想显示某个option的帮助信息,可以将它的help参数设置为optparse.SUPPRESS_HELP,可以用来隐藏命令行选项,例如:
parser = optparse.OptionParser()
parser.add_option('-m', '--my-help', action = 'help', help = 'Show this help message and exit.')
parser.add_option('-a', help = 'This is help of a')
parser.add_option('-b', help = optparse.SUPPRESS_HELP)

(options, args) = parser.parse_args()

执行结果:

mars@mars-Ideapad-V460:~/test$ python helptest.py -m
Usage: helptest.py [options]

Options:
  -h, --help     show this help message and exit
  -m, --my-help  Show this help message and exit.
  -a A           This is help of a
  • version:一般配合在创建解析器时提供version使用,例如:
parser = optparse.OptionParser(version = '1.1')
parser.add_option('-p', '--print-version', action = 'version')

(options, args) = parser.parse_args()

执行结果:

╰─➤  python c.py -p
1.1
╰─➤  python c.py --version
1.1
  • type属性:
    optparse模块有6种内建类型:int、long、float、complex、string、choice,如果想定义自己的类型,参考扩展optparse。对于string类型的输入不做检查;对于int或者long,如果:

    i)输入以0x开头,以十六进制读入。
    ii)输入以0开头,以八进制读入。
    iii)输入已0b开头,以二进制读入。
    iv)其他情况,以十进制读入。

其实对于int和long会调用int()和long()进行转换,如果转换失败会抛出异常。float和complex的读取规则与int、long类似。choice是string的衍生类,是string的列表,指出允许的取值列表,如果输入错误引发OptionValueError异常。
例如:

parser = OptionParser()
parser.add_option('-t', '--test', type = 'choice', choices = ['a', 'b'])

try:
    (options, args) = parser.parse_args()
    print options
except Exception, exc:
    print exc

执行结果:

mars@mars-Ideapad-V460:~/test$ python test.py -t a
{'test': 'a'}
mars@mars-Ideapad-V460:~/test$ python test.py -t c
Usage: test.py [options]

test.py: error: option -t: invalid choice: 'c' (choose from 'a', 'b')

参数解析

前面创建解释器、定义命令行格式无非是为了把用户输入获取到,重头戏就是这一句话了:
(options, args) = parser.parse_args()
它将解析出来的输入赋值给options,其他没解析完的给args,例如:

parser = OptionParser()
parser.add_option('-v', '--value', dest = 'value')

(options, args) = parser.parse_args()
print 'options',options
print 'args',args

执行结果:

mars@mars-Ideapad-V460:~/test$ python test.py -v a b c
options {'value': 'a'}
args ['b', 'c']

如果命令行解析失败,会优雅的给出出错原因并结束应用返回错误码2(Unix命令行错误的惯用值),例如:

mars@mars-Ideapad-V460:~/test$ python test.py -s s
Usage: test.py [options]

test.py: error: no such option: -s
mars@mars-Ideapad-V460:~/test$ echo $?
2

如果觉得我的文章对您有帮助,欢迎关注我(CSDN:Mars Loo的博客)或者为这篇文章点赞,谢谢!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值