From 0a8f3331e3423916a28de8c4e2f61fb9140644fa Mon Sep 17 00:00:00 2001 From: Harmon Date: Thu, 16 Apr 2026 18:45:28 +0800 Subject: [PATCH] Fix IDL runtime dir configuration handling --- .env.example | 3 ++- README.md | 2 +- backend/app/config.py | 44 +++++++++++++++++++++++++++++++++++++------ docs/DEPLOYMENT.md | 6 +++--- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/.env.example b/.env.example index fb7f43d..bf7b013 100644 --- a/.env.example +++ b/.env.example @@ -88,7 +88,8 @@ ORBIT_POOL_LANDSAR= # ----------------------------------------------------------------------------- IDL_EXECUTABLE=C:\Program Files\Harris\ENVI56\IDL88\bin\bin.x86_64\idl.exe IDL_WORKBENCH_PATH=C:\Program Files\Harris\ENVI56\IDL88\bin\bin.x86_64\idlde.exe -IDL_WORKER_RUNTIME_DIR=Z:\Code\Insar_management_system_v2\backend\runtime\idl_worker +# 留空则默认使用项目 backend/runtime/idl_worker +IDL_WORKER_RUNTIME_DIR= IDL_WORKER_DEFAULT_TIMEOUT_SECONDS=14400 IDL_WORKER_MAX_TIMEOUT_SECONDS=43200 IDL_JOB_MAX_ATTEMPTS=1 diff --git a/README.md b/README.md index f4640f6..a7a6ada 100644 --- a/README.md +++ b/README.md @@ -178,7 +178,7 @@ IDL_WORKBENCH_PATH=C:\\Program Files\\Harris\\ENVI56\\IDL88\\bin\\bin.x86_64\\id IDL_DINSAR_DEM_BASE_FILE=D:\\SRTM30m\\SRTMDEM_RSP_SARscape # 工作目录 -IDL_WORKER_RUNTIME_DIR=Z:\\Code\\Insar_management_system_v2\\backend\\runtime\\idl_worker +IDL_WORKER_RUNTIME_DIR=<项目根目录>\\backend\\runtime\\idl_worker # 超时配置 IDL_WORKER_DEFAULT_TIMEOUT_SECONDS=14400 diff --git a/backend/app/config.py b/backend/app/config.py index ceaf17a..77e20b3 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -26,6 +26,38 @@ def _windows_path_to_wsl_mount(path: str) -> str: return f"/mnt/{drive_letter}/{normalized_tail}" +def _clean_path_text(value: str | None) -> str: + return str(value or "").strip().strip('"').strip("'") + + +def _default_idl_runtime_dir() -> str: + return os.path.join(_BACKEND_DIR, "runtime", "idl_worker") + + +def _resolve_idl_runtime_dir(value: str | None) -> str: + fallback_dir = os.path.normpath(_default_idl_runtime_dir()) + text = _clean_path_text(value) + if not text: + return fallback_dir + + normalized = os.path.normpath(text) + if normalized.startswith("\\\\"): + return normalized + + drive, _tail = os.path.splitdrive(normalized) + if drive: + drive_root = drive + os.sep + if not os.path.exists(drive_root): + print( + ">>> [Config] IDL_WORKER_RUNTIME_DIR root unavailable; " + f"fallback to {fallback_dir} (configured: {normalized})" + ) + return fallback_dir + return normalized + + return os.path.normpath(os.path.abspath(normalized)) + + def _read_env_pairs(env_path: str) -> dict[str, str]: env_map: dict[str, str] = {} if not os.path.isfile(env_path): @@ -256,12 +288,11 @@ class Settings(BaseSettings): "ORBIT_QUARANTINE_DIR", os.path.join(self.MONITOR_ORBIT_DIR, "_quarantine"), ) - if not self.IDL_WORKER_RUNTIME_DIR: - object.__setattr__( - self, - "IDL_WORKER_RUNTIME_DIR", - os.path.join(backend_dir, "runtime", "idl_worker"), - ) + object.__setattr__( + self, + "IDL_WORKER_RUNTIME_DIR", + _resolve_idl_runtime_dir(self.IDL_WORKER_RUNTIME_DIR), + ) if not self.RESULT_PUBLISH_ROOT: object.__setattr__( self, @@ -395,6 +426,7 @@ class Settings(BaseSettings): os.makedirs(Settings.RADAR_RAW_CACHE_DIR, exist_ok=True) os.makedirs(Settings.RADAR_GEO_CACHE_DIR, exist_ok=True) os.makedirs(Settings.COLORMAPS_DIR, exist_ok=True) + os.makedirs(settings.IDL_WORKER_RUNTIME_DIR, exist_ok=True) os.makedirs(settings.RESULT_PUBLISH_ROOT, exist_ok=True) os.makedirs(settings.DINSAR_PRODUCT_DIR, exist_ok=True) os.makedirs(settings.PSINSAR_PRODUCT_DIR, exist_ok=True) diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 23dfc80..4948f1b 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -276,9 +276,9 @@ NGINX_PATH=C:\nginx-1.29.4\nginx.exe # IDL / ENVI 路径与 worker 管理目录 IDL_EXECUTABLE=C:\Program Files\Harris\ENVI56\IDL88\bin\bin.x86_64\idl.exe IDL_WORKBENCH_PATH=C:\Program Files\Harris\ENVI56\IDL88\bin\bin.x86_64\idlde.exe -IDL_WORKER_SCRIPT_SOURCE_DIR=Z:\Code\Insar_management_system_v2\IDL\origin -IDL_WORKER_SCRIPT_DIR=Z:\Code\Insar_management_system_v2\IDL\worker_managed -IDL_WORKER_RUNTIME_DIR=Z:\Code\Insar_management_system_v2\backend\runtime\idl_worker +IDL_WORKER_SCRIPT_SOURCE_DIR=<项目根目录>\IDL\origin +IDL_WORKER_SCRIPT_DIR=<项目根目录>\IDL\worker_managed +IDL_WORKER_RUNTIME_DIR=<项目根目录>\backend\runtime\idl_worker IDL_WORKER_DEFAULT_TIMEOUT_SECONDS=14400 IDL_WORKER_MAX_TIMEOUT_SECONDS=43200 IDL_WORKER_TEMP_DIRECTORY=D:\Sarscape_IDL_Area