From 116f07923e968996c79863838c52fc3c4305c9f9 Mon Sep 17 00:00:00 2001 From: konstin Date: Tue, 21 Jul 2026 16:28:51 +0200 Subject: [PATCH 1/3] Add python-version to pyvenv.cfg --- src/virtualenv/create/creator.py | 3 +++ tests/unit/create/test_creator.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/virtualenv/create/creator.py b/src/virtualenv/create/creator.py index 800eb28d7..36cc777cf 100644 --- a/src/virtualenv/create/creator.py +++ b/src/virtualenv/create/creator.py @@ -223,6 +223,9 @@ def set_pyenv_cfg(self) -> None: assert system_executable is not None # ruff:ignore[assert] self.pyenv_cfg["home"] = os.path.dirname(os.path.abspath(system_executable)) self.pyenv_cfg["implementation"] = self.interpreter.implementation + self.pyenv_cfg["python-version"] = ( + f"{self.interpreter.version_info.major}.{self.interpreter.version_info.minor}" + ) self.pyenv_cfg["version_info"] = ".".join(str(i) for i in self.interpreter.version_info) self.pyenv_cfg["version"] = ".".join(str(i) for i in self.interpreter.version_info[:3]) self.pyenv_cfg["executable"] = os.path.realpath(system_executable) diff --git a/tests/unit/create/test_creator.py b/tests/unit/create/test_creator.py index f69d41dc7..df91b1af9 100644 --- a/tests/unit/create/test_creator.py +++ b/tests/unit/create/test_creator.py @@ -326,9 +326,11 @@ def test_prompt_set(tmp_path: Path, creator: str, prompt: str | None, monkeypatc @pytest.mark.parametrize("creator", CURRENT_CREATORS) -def test_version_key_in_pyenv_cfg(tmp_path: Path, creator: str) -> None: +def test_version_keys_in_pyenv_cfg(tmp_path: Path, creator: str) -> None: result = cli_run([str(tmp_path), "--seeder", "app-data", "--without-pip", "--creator", creator]) cfg = PyEnvCfg.from_file(result.creator.pyenv_cfg.path) + version_info = result.creator.interpreter.version_info + assert cfg["python-version"] == f"{version_info.major}.{version_info.minor}" assert "version" in cfg parts = cfg["version"].split(".") assert len(parts) == 3 From 36189bea0a8ec6e2833fed8a38b8141a2c58fdbb Mon Sep 17 00:00:00 2001 From: konstin Date: Tue, 21 Jul 2026 16:30:22 +0200 Subject: [PATCH 2/3] Add changelog entry --- docs/changelog/3193.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changelog/3193.feature.rst diff --git a/docs/changelog/3193.feature.rst b/docs/changelog/3193.feature.rst new file mode 100644 index 000000000..c04a364f4 --- /dev/null +++ b/docs/changelog/3193.feature.rst @@ -0,0 +1 @@ +Add the PEP 838 ``python-version`` field to ``pyvenv.cfg``. From 29291aafa6f4f2757966335d760a7cfe1d0e5dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bern=C3=A1t=20G=C3=A1bor?= Date: Fri, 24 Jul 2026 15:33:37 +0900 Subject: [PATCH 3/3] Simplify set_pyenv_cfg and its version test Bind version_info once instead of repeating self.interpreter.version_info across the python-version, version_info, and version fields. Assert the written python-version against sys.version_info rather than the interpreter object the code just read, so the test fails if the field value is wrong. --- src/virtualenv/create/creator.py | 9 ++++----- tests/unit/create/test_creator.py | 3 +-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/virtualenv/create/creator.py b/src/virtualenv/create/creator.py index 36cc777cf..b0b387f82 100644 --- a/src/virtualenv/create/creator.py +++ b/src/virtualenv/create/creator.py @@ -223,11 +223,10 @@ def set_pyenv_cfg(self) -> None: assert system_executable is not None # ruff:ignore[assert] self.pyenv_cfg["home"] = os.path.dirname(os.path.abspath(system_executable)) self.pyenv_cfg["implementation"] = self.interpreter.implementation - self.pyenv_cfg["python-version"] = ( - f"{self.interpreter.version_info.major}.{self.interpreter.version_info.minor}" - ) - self.pyenv_cfg["version_info"] = ".".join(str(i) for i in self.interpreter.version_info) - self.pyenv_cfg["version"] = ".".join(str(i) for i in self.interpreter.version_info[:3]) + version_info = self.interpreter.version_info + self.pyenv_cfg["python-version"] = f"{version_info.major}.{version_info.minor}" + self.pyenv_cfg["version_info"] = ".".join(str(i) for i in version_info) + self.pyenv_cfg["version"] = ".".join(str(i) for i in version_info[:3]) self.pyenv_cfg["executable"] = os.path.realpath(system_executable) self.pyenv_cfg["command"] = f"{sys.executable} -m virtualenv {self.dest}" self.pyenv_cfg["virtualenv"] = __version__ diff --git a/tests/unit/create/test_creator.py b/tests/unit/create/test_creator.py index df91b1af9..b200a5eca 100644 --- a/tests/unit/create/test_creator.py +++ b/tests/unit/create/test_creator.py @@ -329,8 +329,7 @@ def test_prompt_set(tmp_path: Path, creator: str, prompt: str | None, monkeypatc def test_version_keys_in_pyenv_cfg(tmp_path: Path, creator: str) -> None: result = cli_run([str(tmp_path), "--seeder", "app-data", "--without-pip", "--creator", creator]) cfg = PyEnvCfg.from_file(result.creator.pyenv_cfg.path) - version_info = result.creator.interpreter.version_info - assert cfg["python-version"] == f"{version_info.major}.{version_info.minor}" + assert cfg["python-version"] == f"{sys.version_info.major}.{sys.version_info.minor}" assert "version" in cfg parts = cfg["version"].split(".") assert len(parts) == 3