优化临时文件管理,增强错误日志记录

This commit is contained in:
2026-04-08 11:47:46 +08:00
parent 644babf77e
commit 51b481d174
+22 -5
View File
@@ -310,11 +310,17 @@ def _safe_remove(path: str) -> None:
def _make_isolated_run_paths(base_name: str, cwd: str) -> tuple[str, str, str]:
# 确保保存临时文件的目录存在
db_inp_dir = os.path.join(cwd, "db_inp")
temp_dir = os.path.join(cwd, "temp")
os.makedirs(db_inp_dir, exist_ok=True)
os.makedirs(temp_dir, exist_ok=True)
# 进程号 + UUID 生成唯一后缀,避免并发进程互相覆盖临时文件。
token = f"{os.getpid()}_{uuid.uuid4().hex}"
inp = os.path.join(cwd, "db_inp", f"{base_name}.db.{token}.inp")
rpt = os.path.join(cwd, "temp", f"{base_name}.db.{token}.rpt")
opt = os.path.join(cwd, "temp", f"{base_name}.db.{token}.opt")
inp = os.path.join(db_inp_dir, f"{base_name}.db.{token}.inp")
rpt = os.path.join(temp_dir, f"{base_name}.db.{token}.rpt")
opt = os.path.join(temp_dir, f"{base_name}.db.{token}.opt")
return inp, rpt, opt
@@ -345,11 +351,17 @@ def run_project_return_dict(name: str, readable_output: bool = True) -> dict[str
lib_dir = os.path.dirname(exe)
env["LD_LIBRARY_PATH"] = f"{lib_dir}:{env.get('LD_LIBRARY_PATH', '')}"
process = subprocess.run([exe, inp, rpt, opt], env=env)
process = subprocess.run([exe, inp, rpt, opt], env=env, capture_output=True, text=True)
result = process.returncode
if result != 0:
logging.error(f"EPANET failed with return code {result}")
logging.error(f"EPANET stdout: {process.stdout}")
logging.error(f"EPANET stderr: {process.stderr}")
data["simulation_result"] = "failed"
data["error_code"] = result
data["stdout"] = process.stdout
data["stderr"] = process.stderr
else:
data["simulation_result"] = "successful"
if readable_output:
@@ -360,7 +372,12 @@ def run_project_return_dict(name: str, readable_output: bool = True) -> dict[str
data["input_file"] = inp
data["report_file"] = rpt
data["output_file"] = opt
data["report"] = dump_report(rpt)
if os.path.exists(rpt):
data["report"] = dump_report(rpt)
else:
logging.error(f"EPANET report file not found: {rpt}")
data["report"] = f"Error: EPANET report file not found. Simulation return code: {result}. Check server logs for stdout/stderr."
# 返回内容后删除仿真临时文件,避免临时文件堆积。
_safe_remove(inp)