diff --git a/nox/virtualenv.py b/nox/virtualenv.py index ab015268..cc59eebb 100644 --- a/nox/virtualenv.py +++ b/nox/virtualenv.py @@ -339,15 +339,35 @@ def _check_reused_environment_type(self) -> bool: def _check_reused_environment_interpreter(self) -> bool: """Check if reused environment interpreter is the same.""" - program = "import sys; print(getattr(sys, 'real_prefix', sys.base_prefix))" - original = nox.command.run( - [self._resolved_interpreter, "-c", program], silent=True, log=False + original = self._read_base_prefix_from_pyvenv_cfg() + program = ( + "import sys; sys.stdout.write(getattr(sys, 'real_prefix', sys.base_prefix))" ) + + if original is None: + output = nox.command.run( + [self._resolved_interpreter, "-c", program], silent=True, log=False + ) + assert isinstance(output, str) + original = output + created = nox.command.run( ["python", "-c", program], silent=True, log=False, paths=self.bin_paths ) + return original == created + def _read_base_prefix_from_pyvenv_cfg(self) -> Optional[str]: + """Return the base-prefix entry from pyvenv.cfg, if present.""" + path = os.path.join(self.location, "pyvenv.cfg") + if os.path.isfile(path): + with open(path) as io: + for line in io: + key, _, value = line.partition("=") + if key.strip() == "base-prefix": + return value.strip() + return None + @property def _resolved_interpreter(self) -> str: """Return the interpreter, appropriately resolved for the platform. diff --git a/tests/test_virtualenv.py b/tests/test_virtualenv.py index ac0fa598..5240b524 100644 --- a/tests/test_virtualenv.py +++ b/tests/test_virtualenv.py @@ -335,7 +335,6 @@ def test_create(monkeypatch, make_one): dir_.ensure("test.txt") assert dir_.join("test.txt").check() venv.reuse_existing = True - monkeypatch.setattr(nox.virtualenv.nox.command, "run", mock.MagicMock()) venv.create() @@ -443,6 +442,19 @@ def test_create_reuse_oldstyle_virtualenv_environment(make_one): assert reused +def test_create_reuse_python2_environment(make_one): + venv, location = make_one(reuse_existing=True, interpreter="2.7") + + try: + venv.create() + except nox.virtualenv.InterpreterNotFound: + pytest.skip("Requires Python 2.7 installation.") + + reused = not venv.create() + + assert reused + + def test_create_venv_backend(make_one): venv, dir_ = make_one(venv=True) venv.create()