getopt-解析命令行参数

 

getopt-解析命令行参数

译者:gashero
日期:2009-03-12

这个模块用于解析 sys.argv 中的命令行参数。他支持Unix的 getopt() 函数的功能。长选项的支持使用GNU软件。模块提供了一个函数和一个异常:

getopt(args,options[,long_options])

解析命令行参数,要去掉开头的运行程序引用。所以通常将args赋值为 sys.argv[1:] 。options参数可以跟一串字母,每个字母表示一个选项,含有后续值的选项后面加个冒号。

注意:不像GNU getopt() ,在非选项参数之后,所有的参数都被定义为非选项。

long_options,格式是字符串列表,选项名中不需要包含前导的"--"。长选项需要在参数后附带"=",然后跟一个值。如果只希望接受长选项,可以把options设置成空字符串。长选项会尽可能长的识别,例如long_options为 ['foo','frob'] ,则--fo会匹配--foo。但是--f不会匹配,而抛出 GetoptError 异常。

返回值包含两个元素:一个(option,value)列表,剩余的未解析参数。每个(option,value)对返回时,选项名包含前导的"-"或"--",选项参数作为第二个参数,或者为空字符串。它们在返回列表中出现的顺序与在命令行出现的顺序相同。长短选项混合。

gnu_getopt(args,options[,long_options])

这个函数工作方式类似于 getopt() ,除了使用GNU风格的扫描模式。这意味着选项和非选项可以混合在一起。而 getopt() 会在遇到非选项时就不再继续解析下去了。

如果选项第一个字符是"+",或者如果环境变量包含POSIXLY_CORRECT,遇到非选项参数时就停止解析了。

从Python2.3开始引入。

exception GetoptError

这个异常在发现无法解析的命令行参数时或一个需要参数的选项没有给出时抛出。异常参数是描述错误原因的。对于长选项,给一个不需要参数的选项加了参数也会抛出异常。属性msg和opt给出了错误信息和相关选项,如果没有特定的选项,则opt是空字符串。

exception error

就是 GetoptError 的别名,向后兼容。

例子,使用Unix风格:

>>> 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']

脚本中的常见用法:

import getopt,sys

def main():
    try:
        opts,args=getopt.getopt(sys.argv[1:],'ho:v',['help','output='])
    except getopt.GetoptError,err:
        # 打印帮助信息并退出
        print str(err)
        usage()
        sys.exit(2)
    output=None
    verbose=False
    for o,a in opts:
        if o=='-v':
            verbose=True
        elif o in ('-h','--help'):
            usage()
            sys.exit()
        elif o in ('-o','--output'):
            output=a
        else:
            assert(False,'unhandled option'
    # ...

if __name__=='__main__':
    main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值