78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
from pathlib import Path
|
|
|
|
|
|
def _load_dotenv(path: Path) -> None:
|
|
if not path.exists():
|
|
return
|
|
for raw_line in path.read_text(encoding="utf-8").splitlines():
|
|
line = raw_line.strip()
|
|
if not line or line.startswith("#") or "=" not in line:
|
|
continue
|
|
if line.startswith("export "):
|
|
line = line[len("export ") :].strip()
|
|
key, value = line.split("=", 1)
|
|
key = key.strip()
|
|
value = value.strip().strip("'\"")
|
|
if key:
|
|
os.environ.setdefault(key, value)
|
|
|
|
|
|
def _resolve_path(value: str | None, default: Path, base_dir: Path) -> Path:
|
|
base = Path(value).expanduser() if value else default
|
|
if not base.is_absolute():
|
|
base = base_dir / base
|
|
return base.resolve()
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Settings:
|
|
project_root: Path
|
|
source_root: Path
|
|
db_path: Path
|
|
log_dir: Path
|
|
weights_root: Path
|
|
task_conda_env: str
|
|
mmseg_conda_env: str
|
|
backend_conda_env: str
|
|
weight_mode: str
|
|
enable_shell_tasks: bool
|
|
|
|
|
|
def get_settings() -> Settings:
|
|
default_project_root = Path(__file__).resolve().parents[2]
|
|
_load_dotenv(default_project_root / ".env")
|
|
|
|
project_root = Path(os.getenv("SEG_DATA_SERVER_ROOT", default_project_root)).expanduser()
|
|
if not project_root.is_absolute():
|
|
project_root = (default_project_root / project_root).resolve()
|
|
else:
|
|
project_root = project_root.resolve()
|
|
_load_dotenv(project_root / ".env")
|
|
|
|
sibling_source = project_root.parent / "Seg"
|
|
default_source = sibling_source if sibling_source.exists() else project_root.parent
|
|
source_root = _resolve_path(os.getenv("SEG_SOURCE_ROOT"), default_source, project_root)
|
|
db_path = _resolve_path(os.getenv("SEG_BACKEND_DB"), project_root / "var" / "seg_data_server.sqlite3", project_root)
|
|
log_dir = _resolve_path(os.getenv("SEG_BACKEND_LOG_DIR"), project_root / "var" / "job_logs", project_root)
|
|
weights_root = (project_root / "weights").resolve()
|
|
|
|
return Settings(
|
|
project_root=project_root,
|
|
source_root=source_root,
|
|
db_path=db_path,
|
|
log_dir=log_dir,
|
|
weights_root=weights_root,
|
|
task_conda_env=os.getenv("SEG_TASK_CONDA_ENV", "seg_smp"),
|
|
mmseg_conda_env=os.getenv("SEG_MMSEG_CONDA_ENV", "seg_mmcv"),
|
|
backend_conda_env=os.getenv("SEG_BACKEND_CONDA_ENV", "seg_smp"),
|
|
weight_mode=os.getenv("SEG_WEIGHT_MODE", "copy"),
|
|
enable_shell_tasks=os.getenv("SEG_ENABLE_SHELL_TASKS", "1") == "1",
|
|
)
|
|
|
|
|
|
settings = get_settings()
|