随笔 - 51, 文章 - 1, 评论 - 41, 引用 - 0
数据加载中……

Python写的简易代码统计工具(2)

本文介绍代码统计工具控制台界面部分。

 控制台界面就是用命令行形式执行程序。主要内容是输入参数和结果输出。Python有一个命令行解析模块getopt。它能解析两种选项格式:短格式,长格式。
 短格式:"-"号后面要紧跟一个选项字母。如果还有此选项的附加参数,可以用空格分开,也可以不分开。长度任意,可以用引号。
                        -v  [正确]
                        -omyfile.py  [正确]
                        -o myfile.py [正确]
                        -o "myfile.py" [正确]
长格式:"--"号后面要跟一个单词。如果还有些选项的附加参数,后面要紧跟"=",再加上参数。"="号前后不能有空格。
                         --output=myfile.py [正确]
                         -- output=myfile.py [不正确]
                         --output= myfile.py [不正确]
                         --output = myfile.py [不正确]

getopt模块中函数介绍
opts, args=getopt(args, shortopts, longopts=[])
参数args:需要解析的全部字符串
参数shortopt:短格式选项,如'hf:',h表示-h,f:表示-f string,冒号表示后面跟有参数。
参数longopt:长格式选项,如['help', 'output='],help表示--help,output=表示output=string,等号表示选项需要赋值。
返回值opts:选项和参数对。
返回值args:没有匹配上的选项的参数。
注:-f filename.py 中‘-f’是选项,‘filename’是参数。
如果匹配不符就会抛出异常,如格式是'hf:',则(假设程序名为program)
program -s   [不适合的选项]
program -f   [此选项需要跟参数]
都会抛出异常。

此程序制裁采用了短格式,它需要调用counter.py的函数。
下面是CodeCounter.py中的代码:
# -*- coding: cp936 -*-
'''
统计文件或目录的代码和注释
usage: CodeCounter [-hfdlmto] [string|n]
-h          显示帮助信息
-f string   统计string文件
-d string   统计string目录
-l n        统计n层子目录,-1表示所有子目录
-m string   要统计文件的后缀名,格式如:.c,.h,.cpp
-t string   代码类型,c表示C/C++语言,py表示Python
-o n        输出格式,0表示简易输出,1表示全部输出
'''

import sys
import getopt
# 统计工具的工作部分,见couter.py
from counter import CodeCounter 

def usage():
    
print __doc__

def errmsg():
    
print "参数不对,请参考帮助信息. \nCodeCounter -h显示帮助信息."

def print_result(result, out):
    
print "全部\t代码\t注释\t空行\t文件名"
    total 
= [0,0,0,0]
    
for ele in result:
        total[0] 
+= ele[1][4]
        total[
1+= ele[1][1]+ele[1][3]
        total[
2+= ele[1][2]+ele[1][3]
        total[
3+= ele[1][0]

    
if out == 1:
        
for ele in result:
            
print "%d\t%d\t%d\t%d\t%s" %(ele[1][4], ele[1][1]+ele[1][3],
                                         ele[
1][2]+ele[1][3], ele[1][0], ele[0])
    
print "%d\t%d\t%d\t%d\t总计" % (total[0], total[1], total[2], total[3])
    
def main(argv):
    
# 解析参数
    try:
        opts, args 
= getopt.getopt(argv[1:], 'hf:d:m:l:t:o:')
    
except getopt.GetoptError:
        errmsg()
        
return

    (counter, out, result) 
= (CodeCounter(), 0, [])

    
# 设置参数
    for opt, arg in opts:
        
if opt in ['-h']:
            usage()
            
return
        
elif opt in ['-f']:
            counter.AddCodeFiles(
'f', arg)
        
elif opt in ['-d']:
            counter.AddCodeFiles(
'd', arg)
        
elif opt in ['-m']:
            counter.SetModes(arg)
        
elif opt in ['-l']:
            counter.SetLevel(int(arg))
        
elif opt in ['-t']:
            counter.SetCodeType(arg)
        
elif opt in ['-o']:
            out 
= int(arg)

    
# 统计和输出结果
    counter.Count(result)
    print_result(result, out)
    
if __name__ == '__main__':
    
try
        main(sys.argv)
    
except:
        errmsg()

运行如下:
D:\Work\stat>CodeCounter.py -h
统计文件或目录的代码和注释
usage: CodeCounter [-hfdlmto] [string|n]
-h          显示帮助信息
-f string   统计string文件
-d string   统计string目录
-l n        统计n层子目录,-1表示所有子目录
-m string   要统计文件的后缀名,格式如:.c,.h,.cpp
-t string   代码类型,c表示C/C++语言,py表示Python
-o n        输出格式,0表示简易输出,1表示全部输出

D:\Work\stat>CodeCounter.py -d . -o 1
全部    代码    注释    空行    文件名
46      40      15      3       .\stat.
46      40      15      3       总计

待续

posted on 2008-01-11 16:09 lemene 阅读(401) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理