优化临时文件管理,增强错误日志记录
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user