Source code for phenotypic.sdk_.slurm._environment

"""Environment handoff helpers for SLURM submissions and batch scripts."""

from __future__ import annotations

import os
from collections.abc import Mapping

SLURM_PYTHONPATH_ENV_VAR = "PHENOTYPIC_SLURM_PYTHONPATH"

SLURM_PYTHONPATH_BOOTSTRAP_BASH = f"""\
# Restore the caller's Python import path when site policy filters PYTHONPATH.
if [ -n "${{{SLURM_PYTHONPATH_ENV_VAR}:-}}" ]; then
    if [ -z "${{PYTHONPATH:-}}" ]; then
        export PYTHONPATH="${{{SLURM_PYTHONPATH_ENV_VAR}}}"
    elif [ "$PYTHONPATH" != "${{{SLURM_PYTHONPATH_ENV_VAR}}}" ]; then
        export PYTHONPATH="${{{SLURM_PYTHONPATH_ENV_VAR}}}:$PYTHONPATH"
    fi
fi"""


[docs] def sbatch_submission_environment( environment: Mapping[str, str] | None = None, ) -> dict[str, str]: """Snapshot the caller's Python path under a SLURM-safe variable. Some clusters explicitly filter ``PYTHONPATH`` even when ``sbatch`` uses ``--export=ALL``. PhenoTypic batch scripts restore this namespaced copy before invoking Python. Args: environment: Environment to copy. Defaults to ``os.environ``. Returns: A detached environment mapping suitable for ``subprocess.run``. """ submitted = dict(os.environ if environment is None else environment) python_path = submitted.get("PYTHONPATH", "") if python_path: submitted[SLURM_PYTHONPATH_ENV_VAR] = python_path else: submitted.pop(SLURM_PYTHONPATH_ENV_VAR, None) return submitted