Python optparse

一些python程序需要在命令行执行,并接收参数,选项,optparse和argparse就是Python标准库提供的用于编写CLI执行的应用程序的工具。

optparse

适用范围:全部Python版本(Python2.6、Python3.0 ~ Python3.2只有optparse,2.7和3.3以上才有argparse)。
optparse已经不会有后续开发,所以应尽早迁移到argparse当中。

示例一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python
#_*_ coding:utf-8 _*_
"""该脚本接收任意数量的参数,并转换成大写,参数之间添加空格"""
import optparse
#模块直接运行的时候__name__的值为__main__
if __name__ == '__main__':
#创建一个实例
parser = optparse.OptionParser()
#调用方法,选项(以-或者--开头)被置于options中,剩下的为位置参数
#置于args中。类型为列表,以连字符开头的都被识别为选项,无法识别时会
#导致异常,并且无法捕获
options,args = parser.parse_args()
print ' '.join(args).upper()

示例二:带有选项的脚本

位置参数太多时候,信息并不直观,选项是一个很好的方案。并且:

  • 可以设置为可选,默认值
  • 选项可以设置名称,说明,提升可读性
  • 多个选项可以任意顺序排列组合

选项有两种类型

  1. 开关(标记)如–verbose和–quiet,这种类型不需要接收值
  2. 参数赋值,如–host,–port等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python
#_*_ coding:utf-8 _*_
import optparse
if __name__ == '__main__':
parser = optparse.OptionParser()
#使用add_option为实例添加选项,分别追加了长格式和短格式选项;
#action不设置则脚本接收值,设置为store_true或者store_false则意味不需要值
#如果提供了值,则为True或者False;
#dest设置选项的名称;help设置帮助文本,默认自动添加了--help选项,可以查看帮助信息
parser.add_option('-q','--quiet',
action='store_true',
dest='quiet',
help='Suppress output.',
)
options,args = parser.parse_args()
print ' '.join(args).upper()

另一个例子

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
#_*_ coding:utf-8 _*_
import optparse
if __name__ == '__main__':
parser = optparse.OptionParser()
parser.add_option('-H','--host',default='localhost',dest='host',help='The host to connect to.Defaults to localhost.',type=str,)
parser.add_option('-p','--port',default=5432,dest='port',help='The port to connect to.Defaults to 5432.',type=int,)
options,args = parser.parse_args()
print 'The host is %s.\nThe port is %d.' % (options.host,options.port)

短格式和长格式语法

短格式 值和选项可以紧挨着也可以有空格,并且可以把值包在引号内。
以下四种都是合法的。

1
2
3
4
$ python script.py -H localhost
$ python script.py -H "localhost"
$ python script.py -Hlocalhost
$ python script.py -H"localhost"

长格式 选项和值之间必须有分隔符(空格或者等号)。
以下四种都是合法的。

1
2
3
4
$ python script.py --host localhost
$ python script.py --host=localhost
$ python script.py --host "localhost"
$ python script.py --host="localhost"

位置参数

没有附加选项的参数均被认为是位置参数。

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
#_*_ coding:utf-8 _*_
"""对所有提供的位置参数求和"""
import optparse
if __name__ == '__main__':
parser = optparse.OptionParser()
options,args = parser.parse_args()
print 'The sum of the numbers sent is : %d ' % sum([int(i) for i in args])

计数器

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python
#_*_ coding:utf-8 _*_
"""计算特定选项的次数"""
import optparse
if __name__ == '__main__':
parser = optparse.OptionParser()
#-c -c 和-cc是一样的
parser.add_option('-c',action='count',default=0,dest='count',help='Just count the numbers of the options "-c".')
options,args = parser.parse_args()
print 'The total number is %d' % options.count

列表值

对同一个选项,接收多个值并以列表方式提供给脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python
#_*_ coding:utf-8 _*_
"""打印用户名,每次一个"""
import optparse
if __name__ == '__main__':
parser = optparse.OptionParser()
parser.add_option('-u','--user',action='append',default=[],dest='users',help='The username to printed.Provide this multiple times to print the username for multiple users.')
options,args = parser.parse_args()
for user in options.users:
print 'Username: %s' % user