From 48f82a1b3d756e414d2a881fe6f7c3a44c95b6c9 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Tue, 2 Apr 2024 17:09:54 -0400 Subject: [PATCH] fix: avoid mixing venv and conda from environment (#804) * fix: avoid mixing venv and conda from environment Signed-off-by: Henry Schreiner * tests: add test for CONDA_PREFIX Signed-off-by: Henry Schreiner --------- Signed-off-by: Henry Schreiner --- nox/virtualenv.py | 14 +++++++++----- tests/test_virtualenv.py | 6 ++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/nox/virtualenv.py b/nox/virtualenv.py index 64560b87..b5610540 100644 --- a/nox/virtualenv.py +++ b/nox/virtualenv.py @@ -75,14 +75,18 @@ class ProcessEnv(abc.ABC): allowed_globals: ClassVar[tuple[Any, ...]] = () def __init__( - self, bin_paths: None = None, env: Mapping[str, str] | None = None + self, bin_paths: None = None, env: Mapping[str, str | None] | None = None ) -> None: self._bin_paths = bin_paths self.env = os.environ.copy() self._reused = False + env = env or {} - if env is not None: - self.env.update(env) + for k, v in env.items(): + if v is None: + self.env.pop(k, None) + else: + self.env[k] = v for key in _BLACKLISTED_ENV_VARS: self.env.pop(key, None) @@ -249,7 +253,7 @@ def __init__( self.reuse_existing = reuse_existing self.venv_params = venv_params or [] self.conda_cmd = conda_cmd - super().__init__(env={"CONDA_PREFIX": self.location}) + super().__init__(env={"CONDA_PREFIX": self.location, "VIRTUAL_ENV": None}) def _clean_location(self) -> bool: """Deletes existing conda environment""" @@ -379,7 +383,7 @@ def __init__( if venv_backend not in {"virtualenv", "venv", "uv"}: msg = f"venv_backend {venv_backend} not recognized" raise ValueError(msg) - super().__init__(env={"VIRTUAL_ENV": self.location}) + super().__init__(env={"VIRTUAL_ENV": self.location, "CONDA_PREFIX": None}) def _clean_location(self) -> bool: """Deletes any existing virtual environment""" diff --git a/tests/test_virtualenv.py b/tests/test_virtualenv.py index 12d41c5c..340c2f98 100644 --- a/tests/test_virtualenv.py +++ b/tests/test_virtualenv.py @@ -364,9 +364,15 @@ def test_bin_windows(make_one): def test_create(monkeypatch, make_one): + monkeypatch.setenv("CONDA_PREFIX", "no-prefix-allowed") + monkeypatch.setenv("NOT_CONDA_PREFIX", "something-else") + venv, dir_ = make_one() venv.create() + assert "CONDA_PREFIX" not in venv.env + assert "NOT_CONDA_PREFIX" in venv.env + if IS_WINDOWS: assert dir_.join("Scripts", "python.exe").check() assert dir_.join("Scripts", "pip.exe").check()