""" conf/env.sh 跨语言单源 bootstrap。 用法:在 dw_base/__init__.py 顶部调用一次,之后 Python 侧通过 os.environ[X] 读取。 实现:让 bash 自己解析 env.sh(`bash -c '. env.sh && env -0'`),避免重写解析器导致 bash/python 双解析漂移。 """ import os import subprocess from pathlib import Path def bootstrap_env(env_sh_path: str = None) -> bool: """source env.sh 注入环境变量;返回是否加载成功。 env.sh 不存在时返回 False 静默跳过——Spark executor 上 dw_base 以 zip 分发、不含 conf/, 此时不加载项目 env,由 dw_base/__init__ 跳过 driver 专属初始化(见该文件 guard)。 env.sh 存在但 source 失败(语法错等)仍按 check=True 抛出,driver 上大声失败。 """ if env_sh_path is None: project_root = Path(__file__).resolve().parents[2] env_sh_path = str(project_root / 'conf' / 'env.sh') if not os.path.isfile(env_sh_path): return False result = subprocess.run( ['bash', '-c', f'. "{env_sh_path}" && env -0'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, ) for entry in result.stdout.split(b'\x00'): if not entry: continue key, _, value = entry.decode().partition('=') # setdefault: 若 shell 侧已 export(如 init.sh 已 source env.sh),保留 shell 值不覆盖 os.environ.setdefault(key, value) return True