From 51b481d1743b25b8a5fa557a4e21593faa41eb07 Mon Sep 17 00:00:00 2001 From: Jiang Date: Wed, 8 Apr 2026 11:47:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=B4=E6=97=B6=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=AE=A1=E7=90=86=EF=BC=8C=E5=A2=9E=E5=BC=BA=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/infra/epanet/epanet.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/app/infra/epanet/epanet.py b/app/infra/epanet/epanet.py index 2bf327b..a2e490d 100644 --- a/app/infra/epanet/epanet.py +++ b/app/infra/epanet/epanet.py @@ -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)