microproduct-l-sar/vegetationHeight-L-SAR/autorun.py

283 lines
11 KiB
Python

# coding:utf-8
# coding=gbk
import os, sys
# import multiprocessing
# import subprocess
#import chardet
import concurrent
from concurrent.futures import ThreadPoolExecutor, as_completed
import argparse
import logging
from tool.logs.logHandler import LogHandler
LogHandler.init_log_handler('run_log\\' + 'ISCE_LOG')
logger = logging.getLogger("mylog")
def excteCMD(cmd_txt):
logger.info("\twaitline cmdline:\t{} \t ".format(cmd_txt))
result=os.system(cmd_txt)
cmdlines = ""
if result!=0:
with os.popen("{} 2>&1".format(cmd_txt)) as p:
cmdlines = p.read()
logger.info("\t state:\t{}\t cmdline:\t{} \t{} \n {}\n{}".format(result ,cmd_txt,"="*10,cmdlines,"*"*40))
return result
"""
logger.info("waitline cmdline:\t{} \t++++++++:".format(cmd_txt))
cmd_p = subprocess.Popen(cmd_txt, shell=True,stdout=subprocess.PIPE,cwd=os.getcwd(),bufsize=1,universal_newlines=True,encoding="utf-8")
cmdlines=""
while subprocess.Popen.poll(cmd_p) is None:
line = cmd_p.stdout.readline()
charls = chardet.detect(line)
try:
cmdlines="{}{}\n".format(cmdlines,line.decode(charls['encoding']))
print(line.decode(charls['encoding']))
except:
continue
cmd_p.wait()
result=cmd_p.returncode
if result==0:
cmdlines=""
logger.info("\n{}\t state:\t{}\t cmdline:\t{} \t {} \n {}\n{}".format("="*10,result ,cmd_txt,"="*10,cmdlines,"="*40))
return result
"""
def buildCmdTxt(cmd_line):
cmdStr = cmd_line.replace("\n","")
if runAsExeFlag == False:
cmd_txt = "python ./{0}/{1}".format(py_folder_name, cmdStr)
return cmdStr
pyFileName=cmdStr.split(' ')[0]
if len(pyFileName) == 0:
return ''
exeName=''
if cygwinFlag:
exeName = "./{0}.exe".format(pyFileName.split('.')[0])
else:
exeName = "{0}.exe".format(pyFileName.split('.')[0])
newCmdLine = os.path.join(py_folder_name, cmdStr.replace(pyFileName, exeName))
return newCmdLine
pass
def sigProcess(cmd_lines,log_path):
#print("*********sigProcess log_path:{0}".format(log_path))
for cmd_line in cmd_lines:
#cmd_txt="python ./{0}/{1}".format(py_folder_name,cmd_line.replace("\n",""))
cmd_txt= buildCmdTxt(cmd_line)
#print("cmd_line:{0}".format(cmd_line))
print("cmd_txt:{0}".format(cmd_txt))
if len(cmd_txt) == 0:
print("cmd_line{0} cmd_txt is null".format(cmd_line))
continue
res = excteCMD(cmd_txt)
if res != 0:
print("=================================发生了错误=======================")
sys.exit(0)
pass
def muilProcess(cmd_lines,log_path,process_num=4):
print("*********muilProcess log_path:{0}".format(log_path))
with ThreadPoolExecutor(max_workers=process_num) as pool:
pl = []
for cmd_line in cmd_lines:
#cmd_txt="python {0}/{1}".format(py_folder_name,cmd_line.replace("\n",""))
cmd_txt = buildCmdTxt(cmd_line)
if len(cmd_txt) == 0:
print("cmd_line{0} cmd_txt is null".format(cmd_line))
continue
pl.append(pool.submit(excteCMD,cmd_txt))
for future in as_completed(pl):
data = future.result()
if data != 0:
print("=================================发生了错误=======================")
sys.exit(0)
pass
def createParser():
parser = argparse.ArgumentParser( description='get out path')
parser.add_argument('-e', '--execpath', type=str, dest='execpath',default='',
help='Directory with executable path')
parser.add_argument('-o', '--outpath', type=str, dest='outpath',default='',
help='Directory with the out path')
parser.add_argument('-s', '--step', type=int, dest='step',default=-1,
help='Directory with the out path')
parser.add_argument('-cygwinFlag', '--cygwinFlag', dest='cygwinFlag', default=False,
help='cygwin:True,windows:False')
parser.add_argument('-runAsExe', '--runAsExe', dest='runAsExe', default=True,
help='控制run_files里命令的运行类型,True:执行exe,False执行py文件')
return parser
def cmdLineParse(iargs=None):
'''
Command line parser.
'''
parser = createParser()
return parser.parse_args(args=iargs)
def remove_ISCEApp_from_xml(xmlPath):
"""
修改配置文件的错误路径
"""
if '.xml' in xmlPath:
import xml.dom.minidom as xmldom
domobj = xmldom.parse(xmlPath)
rootNode = domobj.documentElement
# print("elementobj:{0}".format(rootNode.nodeName))
pathInxml = ''
# 获得子标签
propertyElementObj = rootNode.getElementsByTagName("property")
for property in propertyElementObj:
if property.hasAttribute("name"):
if property.getAttribute("name") == "file_name" or property.getAttribute("name") == "metadata_location":
pathNode = property.getElementsByTagName("value")[0]
pathInxml = pathNode.childNodes[0].data
print('pathInxml:', pathInxml)
if '/ISCEApp/' in pathInxml:
pathInxml = pathInxml[pathInxml.find('/ISCEApp/')+9:]
print('Modify PathInxml:', pathInxml)
if pathInxml[0]=='/':
pathInxml = pathInxml[1:]
print('Modify PathInxml:', pathInxml)
pathNode.childNodes[0].data = pathInxml
with open(xmlPath, 'w') as f:
# 缩进换行编码
domobj.writexml(f, addindent=' ', encoding='utf-8')
elif 'slc.vrt'in xmlPath:
from xml.etree.ElementTree import ElementTree
tree = ElementTree()
tree.parse(xmlPath)
root = tree.getroot()
pathInxml = root.find('VRTRasterBand').find('SimpleSource').find('SourceFilename').text
print('pathInxml:', pathInxml)
if '/ISCEApp/' in pathInxml:
pathInxml_new = pathInxml[0:7] + pathInxml[pathInxml.find('/ISCEApp/') + 8:]
root.find('VRTRasterBand').find('SimpleSource').find('SourceFilename').text = pathInxml_new
print('Modify pathInxml:', pathInxml_new)
pathInxml = root.find('VRTRasterBand').find('SimpleSource').find('SourceFilename').text
if '//' in pathInxml:
root.find('VRTRasterBand').find('SimpleSource').find('SourceFilename').text = pathInxml.replace('//', '/')
print('Modify pathInxml:', root.find('VRTRasterBand').find('SimpleSource').find('SourceFilename').text)
tree.write(xmlPath, encoding="utf-8", xml_declaration=True)
# xml_result = []
def get_xml(cwd,step):
get_dir = os.listdir(cwd)
for i in get_dir:
sub_dir = os.path.join(cwd, i)
if os.path.isdir(sub_dir):
get_xml(sub_dir, step)
else:
if (step == '01' or step == '07') and i == 'IW1_top.xml' or i == 'IW1_bottom.xml' or i == 'IW2_top.xml' or i == 'IW2_bottom.xml':
xml_result.append(sub_dir)
elif (step == '01' or step == '02') and 'burst' in i and 'slc.vrt' in i and 'bot' not in i and 'top' not in i:
xml_result.append(sub_dir)
return xml_result
def modify_error_xml(workspace,step):
global xml_result
xml_result = []
if step == '01':
search_dir = os.path.join(workspace, 'reference')
path_list = get_xml(search_dir,step)
for xml_path in path_list:
print('xml_path:',xml_path)
remove_ISCEApp_from_xml(xml_path)
if step == '02':
search_dir = os.path.join(workspace, 'secondarys')
path_list = get_xml(search_dir,step)
for xml_path in path_list:
print('xml_path:', xml_path)
remove_ISCEApp_from_xml(xml_path)
if step == '07':
search_dir = os.path.join(workspace, 'coarse_interferograms')
path_list = get_xml(search_dir,step)
for xml_path in path_list:
print('xml_path:', xml_path)
remove_ISCEApp_from_xml(xml_path)
if step == '07':
search_dir = os.path.join(workspace, 'coreg_secondarys')
path_list = get_xml(search_dir,step)
for xml_path in path_list:
print('xml_path:', xml_path)
remove_ISCEApp_from_xml(xml_path)
def auto_run_main(iargs=None):
global root_path ,py_folder_name,log_path,runAsExeFlag,cygwinFlag
print('auto_run_main iargs:{}'.format(sys.argv))
runAsExeFlag = True
inputArg = cmdLineParse(iargs)
if len(inputArg.outpath) > 0:
root_path = inputArg.outpath
else:
root_path = os.getcwd()
cygwinFlag = inputArg.cygwinFlag
if len(inputArg.execpath) > 0:
py_folder_name = inputArg.execpath
else:
py_folder_name = os.getcwd()
print("root_path:{0}".format(root_path))
log_path = os.path.join(root_path, "log.txt")
run_files_path = os.path.join(root_path, "run_files")
if not os.path.exists(run_files_path):
os.makedirs(run_files_path)
cmd_text_filename = os.listdir(run_files_path)
sorted(cmd_text_filename, key=lambda filename:float(filename.split("_")[1]))
for filename in cmd_text_filename:
logger.info(log_path + "=Excetding data=================")
step = filename.split("_")[1]
if inputArg.step!=-1 and int(step)!=inputArg.step:
#print("step:{0} inputArg.step:{0}".format(int(step),inputArg.step))
continue
'''
else:
print("step:{0} inputArg.step:{0}".format(int(step),inputArg.step))
continue
'''
logger.info(log_path + "=command text:{}=========".format(filename))
cmd_lines = []
with open(os.path.join(run_files_path, filename), 'r', encoding='utf-8') as fp:
cmd_lines = fp.readlines()
# if step in ['01']:#,'01',"02","03","04",'05','06','07','08','09','10',11','12','13','14','15','16']: # 已经执行过的指令
# continue
msg = "=" * 10 + 'running step:' + step + "=" * 10
logger.info(msg)
print(msg)
# modify_error_xml(root_path, step)
if step in ["01", '02', "03", '04', '05', '06', '07', '08', '09']:
sigProcess(cmd_lines, log_path)
elif step in []:
muilProcess(cmd_lines, log_path, process_num=4)
elif step in []:
muilProcess(cmd_lines, log_path, process_num=4)
elif step in []:
muilProcess(cmd_lines, log_path, process_num=2)
elif step in []:
muilProcess(cmd_lines, log_path, process_num=4)
# modify_error_xml(root_path, step)
logger.info( "\n====================================exceted=========================\n")
# if __name__ == '__main__':
# sys.argv.extend([r'-oI:/MicroWorkspace/C-SAR/Deformation/Temporary/processing/isce_workspace','-eI:/onestar/deformation-sentiral/ISCEApp'])
# sys.argv.extend([r'-oI:/MicroWorkspace/C-SAR/Deformation/Temporary/processing/isce_workspace','-eI:/onestar/deformation-sentiral/ISCEProgram'])
# auto_run_main(sys.argv[1:])
# -o I:/MicroWorkspace/C-SAR/Deformation/Temporary/processing/isce_workspace -e I:/onestar/deformation-sentiral/ISCEApp