python模块学习---getopt(命令行参数处理)

来源:互联网 发布:明道 软件 离线 编辑:程序博客网 时间:2024/05/16 07:33

在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的)。在C语言里,main函数的原型为int main(int argc, char **argv),这里主要指linux平台, argc指的是命令行传入的参数个数(程序的name为第一个参数),而argv则是一个指针数组,每一个元素为指向一个命令行参数的指针。在Python里的命令行参数是存储在sys.argv里,argv是一个列表,第一个元素也为程序名称。

一、sys.argv

sys.argv为python的命令行参数列表,sys.argv[0]保存脚本的文件名,从参数1开始,sys.argv保存的是命令行的其他参数,len(sys.argv)为包括脚本文件名在内的命令行参数的个数。
例如:
import sys    print sys.argv[0] ##脚本名  print sys.argv[1] ## 第一个参数print sys.argv  ###参数数组  print len(sys.argv)  ##参数个数  for i in range(1, len(sys.argv)):       print "参数", i, sys.argv[i]  

>>>python argv.py hello world
argv.py
['argv.py', 'hello', 'world']
3
参数 1 hello
参数 2 world

二、getopt.getopt函数()

getopt模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式(-)和长选项模式(--)。模块里面的提供了2个函数和一个类,主要使用getopt函数,先看下函数原型:def getopt(args, shortopts, longopts = [ ])
我们先看一个实例以方便理解:
try:        opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="])    except getopt.GetoptError:        # print help information and exit:          for name, value in opts:       print name, value  for item in args:       print item  

说明如下:

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'
则输出为:
-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  

最后再给出两个实例(参数列表中长选项模式可以不带=号)

第一个

>>> import getopt

>>> args = '-a -b -cfoo -d bar a1 a2'.split()

>>> args

['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']

>>> optlist, args = getopt.getopt(args, 'abc:d:')

>>> optlist

[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]

>>> args

['a1', 'a2']

 

第二个

>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'

>>> args = s.split()

>>> args

['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']

>>> optlist, args = getopt.getopt(args, 'x', [ 'condition=', 'output-file=', 'testing'])

>>> optlist

[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]

>>> args

['a1', 'a2']



0 0
原创粉丝点击