env_loader.py 995 B

12345678910111213141516171819202122232425
  1. """
  2. conf/env.sh 跨语言单源 bootstrap。
  3. 用法:在 dw_base/__init__.py 顶部调用一次,之后 Python 侧通过 os.environ[X] 读取。
  4. 实现:让 bash 自己解析 env.sh(`bash -c '. env.sh && env -0'`),避免重写解析器导致 bash/python 双解析漂移。
  5. """
  6. import os
  7. import subprocess
  8. from pathlib import Path
  9. def bootstrap_env(env_sh_path: str = None) -> None:
  10. if env_sh_path is None:
  11. project_root = Path(__file__).resolve().parents[2]
  12. env_sh_path = str(project_root / 'conf' / 'env.sh')
  13. result = subprocess.run(
  14. ['bash', '-c', f'. "{env_sh_path}" && env -0'],
  15. stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True,
  16. )
  17. for entry in result.stdout.split(b'\x00'):
  18. if not entry:
  19. continue
  20. key, _, value = entry.decode().partition('=')
  21. # setdefault: 若 shell 侧已 export(如 init.sh 已 source env.sh),保留 shell 值不覆盖
  22. os.environ.setdefault(key, value)