Add simulation informaiton to log

This commit is contained in:
DingZQ
2025-06-02 19:02:13 +08:00
parent 8ad9459459
commit 5ede29efd4

View File

@@ -4,6 +4,7 @@ import os
import sys
import json
import base64
from datetime import datetime
import subprocess
import logging
from typing import Any
@@ -288,79 +289,33 @@ def run_project(name: str, readable_output: bool = False) -> str:
inp = os.path.join(os.path.join(dir, 'db_inp'), input + '.inp')
rpt = os.path.join(os.path.join(dir, 'temp'), input + '.rpt')
opt = os.path.join(os.path.join(dir, 'temp'), input + '.opt')
command = f'{exe} {inp} {rpt} {opt}'
print(command)
logging.info(f"Run simulation at {datetime.now()}")
logging.info(command)
data = {}
# DingZQ, 2025-06-02, 使用subprocess.Popen捕获输出到全局日志, 原来的代码是这么写的
# result = os.system(command)
"""
执行带参数的外部exe并捕获输出到全局日志
:param exe_path: exe文件路径
:param arguments: 命令行参数列表
:param timeout: 执行超时时间(秒)
:return: 进程退出状态码
"""
result = -1
try:
# 启动子进程
with subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, # 合并错误输出和标准输出
text=True, # 文本模式Python 3.7+
bufsize=1, # 行缓冲
encoding='utf-8', # 编码设置
errors='replace' # 编码错误处理方式
) as process:
# 实时读取输出流
while True:
output_line = process.stdout.readline()
error_line = process.stderr.readline()
if output_line == '' and process.poll() is not None:
break
if error_line == '' and process.poll() is not None:
break
if output_line:
stripped_line = output_line.rstrip()
logging.info(f"EXE_OUTPUT: {stripped_line}")
if error_line:
stripped_line = error_line.rstrip()
logging.error(f"EXE_ERROR: {stripped_line}")
# 获取退出状态码
returncode = process.poll()
# 记录结束状态
logging.info("-" * 60)
if returncode == 0:
logging.info(f"成功结束! 退出码: {returncode}")
else:
logging.error(f"异常结束! 退出码: {returncode}")
result = returncode
except Exception as e:
logging.exception(f"执行过程中出错: {str(e)}")
result = -1 # 自定义错误码
result = os.system(command)
logging.info(f"Simulation result: {result}")
if result != 0:
data['simulation_result'] = 'failed'
logging.error('simulation failed')
else:
data['simulation_result'] = 'successful'
logging.info('simulation successful')
if readable_output:
data |= _dump_output(opt)
else:
data['output'] = dump_output_binary(opt)
data['report'] = dump_report(rpt)
logging.info(f"Report: {data['report']}")
return json.dumps(data)