在目录下增加如下图红框的文件,我希望自动更新对应红框文件名的配置文件config.txt,以及在cpp文件中自动插入相应的代码
实现代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import json
a = "EV_EVENT"
b = "\""
c = "{"
d = "}"
e = "_"
f = ":"
g = " "
h = ","
tab = " "
kBindInsertFlag = "//insert code"
kFuncInsertFlag = "//insert function code"
kConFile = "config.txt"
kGenBindFuncFileTest = "genBindFunc.cpp"
kGenFuncFileTest = "genFunc.cpp"
kGenBindFuncFile = "InfoProviderReceiver.cpp"
kGenFuncFile = "InfoProviderReceiver.cpp"
fo1 = open(kGenBindFuncFileTest, "w")
fo2 = open(kGenFuncFileTest, "w")
def insertCode(filename, filenameadd, kInsertFlag):
file = open(filename, "r")
file_add = open(filenameadd, "r")
content = file.read()
content_add = file_add.read()
pos = content.find(kInsertFlag)
if pos != -1:
content = content[:pos] + content_add + content[pos:]
file = open(filename, "w")
file.write( content )
file.close()
file_add.close()
print ("insert code success \n")
return
def genBindCallBackAndSubscribe(basename,root):
fo1.write(" // "+b+"Register "+basename+" Info Receive Callback"+b+"\n")
fo1.write(" m_pcEventReceiver->Subscribe(EV_EVENT_"+root[2:].upper()+ \
e+basename.upper()+", boost::bind(&InfoProviderReceiver::Recv"+ \
root[2:]+basename+", this, _1));\n\n")
return
def genFunction(basename,root):
str = "if (nullptr == pMsg) { \n \
return;\n\
}"
str1 = "if (nullptr == msg) {\n\
return;\n\
}"
fo2.write("void\n")
fo2.write("InfoProviderReceiver::Recv"+root[2:]+basename+"(void* pMsg)\n")
fo2.write(c+"\n")
fo2.write(tab+"INFO_LOG(\"[InfoProviderReceiver]-------------Recv"+root[2:]+basename+"\\n\");\n")
fo2.write(tab+str+"\n")
fo2.write(tab+root[2:]+"::"+basename+"* msg = reinterpret_cast<"+root[2:]+"::"+basename+"*>(pMsg);\n")
fo2.write(tab+str1+"\n")
fo2.write(tab+root[2:]+"::"+basename+"* copyMsg = new "+root[2:]+"::"+basename+"();"+"\n")
fo2.write(tab+"copyMsg->Swap(msg);" + "\n\n")
fo2.write(tab+"if (nullptr != m_pTransThread) {"+"\n")
fo2.write(tab*2+"InfoProviderM2VRequest* request = new InfoProviderM2VRequest(EV_EVENT_"+\
root[2:].upper()+e+basename.upper()+", copyMsg);\n")
fo2.write(tab*2+"m_pTransThread->PostRequest(request);"+"\n")
fo2.write(tab+d+"\n"+d+"\n")
def LoadJsonConfig(filename):
fileobj = open(filename)
filecontent = fileobj.read()
# print filecontent
fileobj.close()
jsonobj = None
try:
jsonobj = json.loads(filecontent)
except Exception as e:
print("### LoadJsonConfig ERROR")
else:
print("### LoadJsonConfig OK")
return jsonobj
def genJsonDict(basename,root):
keyObjName = a+e+root[2:].upper()+e+basename.upper()
keyObjSubName = "name"
ObjSubNameValue = root[2:]+"::"+basename
keyObjSubType = "type"
ObjSubTypeValue = "EV_IPC,EV_INP"
subDict = {keyObjSubName:ObjSubNameValue, keyObjSubType:ObjSubTypeValue}
Dict = {keyObjName:subDict}
return Dict
def main():
filePath='./'
fileType='.proto'
# fo = open("test2.txt", "w")
# load config
jsonobj= LoadJsonConfig(kConFile)
EventNameDict = jsonobj["EV_EVENT"]
for root, dirs, files in os.walk(filePath):
for name in files:
flag = False
if fileType in name:
basename = os.path.splitext(name)[0]
keyObjName = a+e+root[2:].upper()+e+basename.upper()
Dict = genJsonDict(basename,root)
for key in sorted(EventNameDict.keys()):
if key == keyObjName:
print ("repeat ==== "+keyObjName)
flag = True
break
if flag == False:
jsonobj["EV_EVENT"].update(Dict)
with open(kConFile, 'w') as f:
json.dump(jsonobj, f, indent=4, ensure_ascii=False)
#creat code
genBindCallBackAndSubscribe(basename,root)
#creat code
genFunction(basename,root)
# fo.write(b+keyObjName+b+f+g+c+"\n")
# fo.write(tab+b+keyObjSubName+b+f+g+ObjSubNameValue+h+"\n")
# fo.write(tab+b+keyObjSubType+b+f+g+b+ObjSubTypeValue+b+"\n")
# fo.write(d+h+"\n")
# fo.close()
fo1.close()
fo2.close()
#insert to file
insertCode(kGenBindFuncFile, kGenBindFuncFileTest, kBindInsertFlag)
insertCode(kGenFuncFile, kGenFuncFileTest, kFuncInsertFlag)
#delete test file
os.remove(kGenBindFuncFileTest)
os.remove(kGenFuncFileTest)
if __name__ == "__main__":
main()
实现效果如下: