python批处理调可执行程序

本文介绍了一种利用Python进行批量文件搜索、处理和生成作业订单的方法,通过递归遍历目录查找特定文件,自动创建并修改XML配置文件,执行处理脚本,同时记录日志,实现高效自动化工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os
import shutil
import xml.dom.minidom
import sys
import time

def makedir(dst_filepath):
    folder = os.path.exists(dst_filepath)
    if not folder:
        os.makedirs(dst_filepath)

def tohour(second):
    hour,minute=0,0
    minute = int(second/60)
    if minute>=1:
        second = second - minute * 60
        hour = int(minute/60)
        if hour >=1:
            minute = minute - hour * 60

    if hour>0:
        str = "%dh%2dm%0.2fs" %(hour,minute,second)
    elif minute>0:
        str = "%2dm%0.2fs" %(minute,second)
    else:
        str = "%0.2fs" % (second)
    return str

def iter_files(input, keyword_list):
    aim_file_list = []
    curlist = os.listdir(input)
    for file in curlist:
        cur_file = os.path.join(input, file)
        if os.path.isdir(cur_file):
            get_list = iter_files(cur_file,keyword_list)
            aim_file_list = aim_file_list + get_list
        else:
            flags = len(keyword_list)
            for keyword in keyword_list:
                if file.find(keyword) >=0:
                    flags = flags - 1
                else:
                    break
            if flags==0:
                aim_file_list.append(cur_file)

    return aim_file_list

def generate_xml(srcfile,dstdir,modelxml,job_order):

    if not os.path.isfile(modelxml):
        print("model xml error")
        return

    shutil.copy(modelxml, job_order)

    # 使用minidom解析器打开 XML 文档
    doc = xml.dom.minidom.parse(job_order)
    root = doc.documentElement


    input_file_node = root.getElementsByTagName("File_Name")[0]
    input_text_node = input_file_node.childNodes[0]
    input_text_node.nodeValue = srcfile


    output_dir_node = root.getElementsByTagName("File_Name")[1]
    out_text_node = output_dir_node.childNodes[0]
    out_text_node.nodeValue = dstdir

    #print(input_text_node.data)
    #print(out_text_node.data)

    f = open(job_order, 'w')
    doc.writexml(f, indent='',addindent='\t', newl='\n', encoding='utf-8')
    f.close()
def mult_run():
    input_dir = r"D:\VMcentosShare\DATAROOT"
    work_dir = r"D:\VMcentosShare\DATAROOT\work_dir"
    template_xml = r"D:\VMcentosShare\DATAROOT\IPF\hy1_oct_l2d_pro\release\template.xml"
    mode_exe2 = r"D:\VMcentosShare\DATAROOT\IPF\hy1_oct_l2d_pro\release\V1.00\processing\hy1_oct_l2d_pro_V1.00.sh"
    processing_exe = r"D:\VMcentosShare\HY1\HY1Code\HDF5toGTiffV1.0\Bin\HDF5toGTiff.exe"

    # input_dir = r"/mnt/hgfs/VMcentosShare/DATAROOT"
    # work_dir = r"/mnt/hgfs/VMcentosShare/DATAROOT/work_dir"
    # template_xml = r"/mnt/hgfs/VMcentosShare/DATAROOT/IPF/hy1_oct_l2d_pro/release/template.xml"
    # processing_exe  = r"/mnt/hgfs/VMcentosShare/DATAROOT/IPF/hy1_oct_l2d_pro/release/V1.00/processing/hy1_oct_l2d_pro_V1.00.sh1"

    # input_dir = sys.argv[1]
    # work_dir = sys.argv[2]
    # template_xml = sys.argv[3]
    # processing_exe = sys.argv[4]

    if not os.path.isdir(input_dir):
        print("input_dir error,check you inputdir is exist.%s" % (input_dir))
        exit()

    keyword_list = ["_10.h5", "H1C_OPER_OCT_L1B"]
    input_file_list = iter_files(input_dir, keyword_list)
    IS_REDO = False

    total_num = len(input_file_list)
    print("search over, total num:%d" % (total_num))
    if total_num == 0:
        print("search [.h5] error,check you inputdir")
        exit()

    if not os.path.isfile(template_xml):
        print("template_xml error,check you template_xml is exist")
        exit()

    if not os.path.isfile(processing_exe):
        print("processing_exe error,check you processing_exe is exist")
        exit()

    job_order_dir = os.path.join(work_dir, "job_order")
    output_dir = os.path.join(work_dir, "output")
    log_dir = os.path.join(work_dir, "log")
    makedir(job_order_dir)
    makedir(output_dir)
    makedir(log_dir)

    start_id = 100000001
    jober_list = []

    # 生成job order
    print("start generate job_order")
    for i in range(0, len(input_file_list)):
        inputfile = input_file_list[i]
        id = start_id + i
        job_order_name = "%d.xml" % (id)
        job_order = os.path.join(job_order_dir, job_order_name)
        dstdir = os.path.join(output_dir, "%d" % (id))
        makedir(dstdir)
        generate_xml(inputfile, dstdir, template_xml, job_order)
        jober_list.append(job_order)

    # 开始执行
    total_log = os.path.join(work_dir, "total_log.txt")
    f = open(total_log, "a+")

    print("start to run...")
    total_task = len(jober_list)
    for i in range(0,total_task):
        job_order = jober_list[i]
        id = start_id + i
        log_name = "%d.log" % (id)
        log_path = os.path.join(log_dir, log_name)
        if IS_REDO and os.path.exists(log_path):
            continue
        cmd = "%s %s>%s 2>&1" % (processing_exe, job_order, log_path)

        start = time.time()
        return_code = os.system(cmd)
        end = time.time()
        cost_time = (end -start)
        print("progress num[%d]:cost time:%s, left time:%s " % (i+1,tohour(cost_time), tohour(cost_time*(total_task-i-1))))
        f.write("num[%d] %d %s\n" % (i + 1, return_code, input_file_list[i]))

    f.close()

if __name__ == '__main__':

    mult_run()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值