1.需求来源
有时候我们需要写一些脚本处理一些任务,可能根据不同的条件输入不同的命令,来完成不同的任务。能不能做到跟linux操作系统一样,看着更高大上一点呢?
答案当然是可以的啦!getopt能满足你的需求
先看个linux 中的系统命令吧:最终目的就是写出类似的脚本。
2.getopt介绍
getopt这个函数 就是用来抽取 sys.argv 获得的用户输入来确定执行步骤。
getopt是个模块,而这个模块里面又有getopt 函数,所以getopt需要这样这样用。
getopt.getopt( [命令行参数列表], "短选项", [长选项列表] )
该函数返回两个值. opts 和args
opts 是一个存有所有选项及其输入值的元组.当输入确定后,这个值不能被修改了.
args 是去除有用的输入以后剩余的部分.
1 import getopt,sys 2 shortargs = ‘f:t‘ #短选项 3 longargs = [‘directory-prefix=‘, ‘format‘, ‘--f_long=‘] #长选项 4 opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs) 5 print ‘opts=‘,opts 6 print ‘args=‘,args
getopt函数的格式是getopt.getopt ( [命令行参数列表], "短选项", [长选项列表] ) 短选项名后的冒号(:)表示该选项必须有附加的参数。 长选项名后的等号(=)表示该选项必须有附加的参数。
几种输出结果为:
分清longargs长选项里面的数据,是什么样的必须在前面追加--,不然出异常。例如
正确格式:----f_long=‘data‘
错误格式:--f_long=‘data‘
正确:
错误:
不同的数据参数格式,被捕获的结果不一样:当格式正确的时候被opts捕获,当不是参数格式的时候被args捕获。
选项的写法要求
对于短格式,"-"号后面要紧跟一个选项字母。如果还有此选项的附加参数,可以用空格分开,也可以不分开。长度任意,可以用引号。如以下是正确的:
-o
-oa
-obbbb
-o bbbb
-o "a b"
对于长格式,"--"号后面要跟一个单词。如果还有些选项的附加参数,后面要紧跟"=",再加上参数。"="号前后不能有空格。如以下是正确的:
--help=file1
而这些是不正确的:
-- help=file1
--help =file1
--help = file1
--help= file1
3.如何使用getopt进行分析
使用getopt模块分析命令行参数大体上分为三个步骤:
1.导入getopt,sys模块。
2.分析命令行参数。
3.处理结果。
第一步:导入模块
import sys,getopt
第二步:处理方法如下
try: opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="]) except getopt.GetoptError: # print help information and exit:
解释如下:
1. 处理所使用的函数叫getopt() ,因为是直接使用import 导入的getopt 模块,所以要加上限定getopt 才可以。
2. 使用sys.argv[1:] 过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)。
3. 使用短格式分析串"ho:"
。当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一
个":" 号 。所以"ho:" 就表示"h" 是一个开关选项;"o:" 则表示后面应该带一个参数。
4. 使用长格式分析串列表:["help", "output="] 。长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数 。这个长格式表示"help" 是一个开关选项;"output=" 则表示后面应该带一个参数。
5. 调用getopt 函数。函数返回两个列表:opts 和args 。opts 为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数。opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串‘‘ 。
6. 整个过程使用异常来包含,这样当分析出错时,就可以打印出使用信息来通知用户如何使用这个程序。
如上面解释的一个命令行例子为:
‘-h -o file --help --output=out file1 file2‘
在分析完成后,opts 应该是:
[(‘-h‘, ‘‘), (‘-o‘, ‘file‘), (‘--help‘, ‘‘), (‘--output‘, ‘out‘)]
而args 则为:
[‘file1‘, ‘file2‘]
第三步:主要是对分析出的参数进行判断是否存在,然后再进一步处理。主要的处理模式为:
for o, a in opts: if o in ("-h", "--help"): usage() #处理参数 sys.exit() if o in ("-o", "--output"): output = a
使用一个循环,每次从opts 中取出一个两元组,赋给两个变量。o 保存选项参数,a 为附加参数。接着对取出的选项参数进行处理。
实例代码:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 import getopt,sys 4 5 def usage(): 6 print "Usage:%s [-a|-o|-c] [--help|--output] args...." %(sys.argv[0]) 7 8 if __name__==‘__main__‘: 9 try: 10 shortargs = ‘f:t‘ 11 longargs = [‘directory-prefix=‘, ‘format‘, ‘--f_long=‘] 12 opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs) 13 print ‘****************opts********************‘ 14 print ‘opts=‘,opts 15 print ‘****************args********************‘ 16 print ‘args=‘,args 17 18 for opt,arg in opts: 19 if opt in (‘-h‘,‘--help‘): 20 usage() 21 sys.exit(1) 22 elif opt in (‘--f_long‘): 23 print ‘--f_long=‘,opt 24 else: 25 print ‘%s====> %s‘ %(opt,arg) 26 except getopt.GetoptError: 27 print ‘getopt error!‘ 28 usage() 29 sys.exit(1)
运行结果:
[[email protected] test]# python test1.py -f ‘test‘ -t --directory-prefix=‘aaaaaaa‘ ----f_long=‘bbbbb‘ --format
****************opts********************
opts= [(‘-f‘, ‘test‘), (‘-t‘, ‘‘), (‘--directory-prefix‘, ‘aaaaaaa‘), (‘----f_long‘, ‘bbbbb‘), (‘--format‘, ‘‘)]
****************args********************
args= []
--f_long= -f
-t====>
--directory-prefix====> aaaaaaa
----f_long====> bbbbb
--format====>
expect类提示:
[[email protected] test]# python test1.py -f ‘test‘ -h --directory-prefix=‘aaaaaaa‘ ----f_long=‘bbbbb‘ --format
getopt error!
Usage:test1.py [-a|-o|-c] [--help|--output] args....
参考文档:http://andylin02.iteye.com/blog/845355