Dive Into Python学习日志

来源:互联网 发布:淘宝活性炭都是假的吗 编辑:程序博客网 时间:2024/05/14 17:04
 
def main (argv):
    
try:
    opts,args 
= getopt.getopt (argv, "hg:d", ["help","grammar="])
    
except getopt.GetoptError:
    usage()
    sys.exit(
2)
    
for opt, arg in opts:
    
if opt in ('-h','--help'):
        usage ()
        sys.exit()
    
elif opt == '-d':
        
global _debug
        _debug 
= 1
    
elif opt in ('-g','--grammar'):
        grammar 
= arg
    source 
= " ".join(args)

if __name__ == "__main__":
    main (sys.argv[
1:])

这段代码很有实用价值。应该能看懂这部分代码的大致意思。
首先sys.argv可以获取命令行参数,可以尝试下面的程序:
<code>
# getparams.py
import sys
print sys.argv
</code>
再如下运行它:
python getparams.py -h -i in --out out.xml
结果为:
['getparams.py','-h','-i','in','--out','out.xml']
如此,sys.argv的工作也就明白了。所以要传递参数只需sys.argv[1:]

下面再看关健的getopt.getopt:
先看下它的参数格式
    getopt.getopt (args,"",[longopts])
第一个参数是命令行参数列表,也就是要解析的所有内容
第二个参数是列出所有关心的短参数,短参数如-d our.xml
第三个参数是列出所有关心的长参数,长参数如 --help 是可选的
另外,不论长参数还是短参数都有两种形式
开关型参数,即后面不用跟值就可完整表达意思,如 -h, --help
普通型参数,后面要跟上一个值来表达出完整意思,如 -i in.xml --out out.xm
为了函数getopt.getopt能区分出这两种参数,它定义自己的表达规则:
如果一个短参数是开关型参数,那么直接在参数列表中列出就可,如h,但如果遇到这个短参数i:表明在-i后面的一个值是它的参数值。
长参数和短参数基本类似,只是它不是后面加冒号,而是加‘=’
所以下面的语句意思应该就很清楚了
    getopt.getopt (args,'hd:vi:',['help','out='])
它关心的是命令行中 -h,-d,-v,-i,--help和--out,其中-h,-v,--help是开关型参数,其它不是:)

这个函数返回的是两个list变量opts和args. opts是一个包括了所以我们关心的命令行中的参数及它们的值(如果是开关型参数,那么值为空),args就是其实所有的参数。
所以程序中for循环部分也就容易理解了。

下面给出一个例子方便理解:
argv = ['-h','-i','in.xml','-v','-d','debug','--help','--out','out.xml','file1','file2']
执行下列语句
    opts,args = getopt.getopt(argv,'hi:vd:',['--help','out=']
后,opts为:
[('-h',''),('-i','in.xml'),('-v',''),('-d','debug'),('--help',''),('--out','out.xml')]
args为:
['file1','file2']

到此,这部分代码就理解完了。是一段很有用的代码样例啊。
原创粉丝点击