依旧直接脚本实例讲解:
本脚本是根据文件后缀来确定输出什么内容到error日志文件
其中用到了进程池,加锁写文件等内容。。。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import multiprocessing
import time
import sys
import re
import os
import sre_compile
import subprocess
import commands
from subprocess import Popen, PIPE
#线程调用的函数
def worker_codecheck(line,i,file_tail,lock):
if Match(r'(java|JAVA|Java)',file_tail):
os.system('echo "java|JAVA|Java" >/root/errors_%s.txt'%i)
elif Match(r'(cpp|CPP|hpp|h)',file_tail):
#获取写入错误信息的文件的文件对象
f = open(r'/root/errors_%s.txt'%i,'w')
#调用cpplint检查并将输出的错误信息写入error文件
p = Popen('python /home/cpplint.py --verbose=5 %s'%line, shell=True, stderr=f)
#等待检查结束
p.wait()
#不需要检查的后缀文件
else:
print 'The document does not need to be checked:%s'%line
return
#操作文件时加锁,将errors_%s.txt文件的内容都输出到errors_1.txt中
if (i > 1) and lock.acquire():
os.system('cat /root/errors_%s.txt >> /root/errors_1.txt'%i)
#释放
lock.release()
def main():
#切换到项目目录下面
os.chdir('/root')
#打印当前时间
print time.strftime(ISOTIMEFORMAT, time.localtime(time.time()))
#读取文件开始检查
lines=open('filelist','r').readlines()
#创建进程池,限制最多有5个进程,防止进程过多 set the processes max number 5
pool = multiprocessing.Pool(processes = 5)
#创建lock,写文件时使用
lock = multiprocessing.Manager().Lock()
for i in range(len(lines)):
#获取文件后缀:os.path.basename(lines[i])是获取文件名
file_tail = (os.path.basename(lines[i]))[(os.path.basename(lines[i])).rfind('.') + 1:]
if Match(r'(java|JAVA|Java|cpp|CPP|hpp|h)',file_tail) :
#调用线程检查函数 结果输出到:errors_1.txt :
pool.apply_async(worker_codecheck, (lines[i],(i+1),file_tail,lock))
#关闭pool,不再接受新的任务
pool.close()
#主进程阻塞,等待子进程的退出,join方法要在close或terminate之后使用
pool.join()
print time.strftime(ISOTIMEFORMAT, time.localtime(time.time()))
if __name__ == "__main__":
main()