技术开发 频道

python为Java项目增加预编译脚本

  【IT168 技术文档】早就听说python是一个十分不错的脚本语言,语法简洁而且开发效率很高。在从http://www.python.org下载了最新的windows版本的python解释器后,我又从eclipse的插件网下了pydev这个支持Python在Eclipse开发的插件。

  Python虽然是unix/linux下的东西,但是由于其执行和编写都很简单,所以在时常工作中能够快速解决一些小问题。同时,对于以后我需要研究算法,做论文的时候,也可以用python来快速开发一个算法的测试demo,尽量不必纠缠于程序具体实现时候的困难。

  Python语言学起来比较容易,网上据说,python开发的效率比perl,php,ruby都高。在研究了IBM developworks的一篇文章:应用Python解决一些实际问题(http://www-128.ibm.com/developerworks/cn/linux/tips/l-python/)后,我也为现在正在做的J2ME项目做了个代码的预编译处理脚本。通过扫描Java项目中的标签,#if_version,#end_version,从一个原始的J2ME项目自动产生成各个机型的版本,比如NOKIA。索爱,MOTO。下面就是我第一次写的这个Python小程序,总共才100行多点,如果用其它语言写,肯定不止这么少。

  1import sys, string, os   2   3g_sourcepath = ''   4g_destpath=''   5g_parsefileext=['java','jsp',   6 'c','cpp','h',   7 'py','pl','php']   8   9def getversionlist():   10 file = open('version.txt','r')   11 lines = file.readlines()   12 file.close()   13 for i in range(len(lines)) :   14 lines[i] = lines[i][:-1]   15 return lines   16   17def isparsefile(filename):   18 splits = os.path.splitext(filename)   19 if len(splits) < 2:   20 return False   21 ext = splits[1]   22 ext = ext[1:]   23 if ext in g_parsefileext :   24 return True   25 else:   26 return False   27   28def getsubdir(dirname):   29 basedirlen = len(g_sourcepath)   30 if basedirlen >= len(dirname)-1:   31 return ''   32 subdir = dirname[basedirlen+1:]   33 return subdir   34   35def scan(arg, dirname, names):   36 for filename in names:   37 # 如果不是文件(还可能是目录),则跳过   38 if os.path.isfile(dirname+'\\'+filename) == False:   39 continue   40 # 如果是生成版本说明文件,则跳过   41 if filename == 'version.txt':   42 continue   43 if isparsefile(filename) :   44 fileparsecopy(dirname,filename,arg)   45 else:   46 fileonlycopy(dirname,filename,arg)   47   48def fileonlycopy(dirname,filename,verlist):   49 srcfilename = dirname+'\\'+filename   50 file = open(srcfilename,'r')   51 text = file.read()   52 file.close()   53 subdir = getsubdir(dirname)   54 for ver in verlist :   55 destfilepath = g_destpath+'\\'+ver   56 if len(subdir) > 0 :   57 destfilepath = destfilepath +'\\'+subdir   58 if(os.path.exists(destfilepath) == False):   59 os.mkdir(destfilepath)   60 destfilename = destfilepath+'\\'+filename   61 file = open(destfilename,'w')   62 file.write(text)   63 file.close()   64 print 'copy '+destfilename   65   66def fileparsecopy(dirname,filename,verlist):   67 srcfilename = dirname+'\\'+filename   68 file = open(srcfilename,'r')   69 srclines = file.readlines()   70 file.close()   71   72 subdir = getsubdir(dirname)   73   74 destfiletexts = []   75 for ver in verlist :   76 destfiletexts.append('')   77   78 # 扫描源文件的每一行   79 curverindex = -1   80 lineno = 1   81 for curline in srclines :   82 wordindex = -1   83 verindex = 0   84 for flag in verlist :   85 if '#if_version '+flag in curline :   86 curverindex = verindex   87 break   88 elif '#end_version' in curline :   89 curverindex = -1   90 break   91 verindex = verindex +1   92   93 if verindex == len(verlist) : # 不是标记行   94 if curverindex >= 0: # 某个版本标记内的行   95 destfiletexts[curverindex] = destfiletexts[curverindex] + curline   96 else : # 所有版本都有的内容   97 for i in range(len(destfiletexts)) :   98 destfiletexts[i] = destfiletexts[i]+ curline   99   100 lineno = lineno +1   101 # 产生各个版本的目标文件   102 verindex = 0;   103 for ver in verlist :   104 destfilepath = g_destpath+'\\'+ver   105 if len(subdir) > 0 :   106 destfilepath = destfilepath +'\\'+subdir   107 if(os.path.exists(destfilepath) == False):   108 os.mkdir(destfilepath)   109 destfilename = destfilepath+'\\'+filename   110 file = open(destfilename,'w')   111 file.write(destfiletexts[verindex])   112 file.close()   113 verindex = verindex + 1   114 print 'parse '+ destfilename   115   116# main   117if len(sys.argv) < 3 :   118 sys.stderr.write("No source directory or dest directory parameter!");   119else:   120 g_sourcepath = sys.argv[1]   121 g_destpath = sys.argv[2]   122 os.chdir(g_sourcepath)   123 verlist = getversionlist()   124 os.path.walk(g_sourcepath, scan, verlist)   125sys.exit(1)   126
0
相关文章