`
gashero
  • 浏览: 944051 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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()

 

1
0
分享到:
评论
1 楼 syre 2009-08-18  
OptionParser 功能更强一些。getopt 返回的东西经常还是要再解析一次。

相关推荐

Global site tag (gtag.js) - Google Analytics