_root.py 1.2 KB

123456789101112131415161718192021222324
  1. # -*- coding: utf-8 -*-
  2. r"""安装根推算(公共层内部助手,2026-09-22 P1 迁移时新增)。
  3. 为什么需要它: 平台件原先各自写 `pathlib.Path(__file__).resolve().parents[1]` 推安装根 ——
  4. 那是按"文件在 `src/` 下一层"这个**位置假设**写的;P1 把它们迁到
  5. `app_common/app_common_guanlan/`(深三层)后,同一个式子会算成 `app_common/common`。
  6. 所以改成**按标记找根**:从文件所在目录向上找同时含 `configs/` 与 `guanlan.py`(或 `install-info.json`)
  7. 的那一层;找不到才回退到原先的三层上跳(迁移前的布局)。
  8. 保持不变: `WINDSCADA_ROOT` 环境变量覆盖仍然优先(见 paths.py)。
  9. """
  10. from __future__ import annotations
  11. import pathlib
  12. def install_root(start=None, fallback_up: int = 3) -> pathlib.Path:
  13. p = pathlib.Path(start).resolve() if start else pathlib.Path(__file__).resolve()
  14. base = p if p.is_dir() else p.parent
  15. for cand in [base, *base.parents]:
  16. if (cand / 'configs').is_dir() and ((cand / 'guanlan.py').is_file()
  17. or (cand / 'install-info.json').is_file()):
  18. return cand
  19. return base.parents[fallback_up - 1]