diff --git a/news/13010.removal.rst b/news/13010.removal.rst new file mode 100644 index 00000000000..35e42d006c8 --- /dev/null +++ b/news/13010.removal.rst @@ -0,0 +1,2 @@ +On python 3.13+, the ``pkg_resources`` metadata backend is not used anymore, +and pip does not attempt to detect installed ``.egg`` distributions. diff --git a/src/pip/_internal/metadata/__init__.py b/src/pip/_internal/metadata/__init__.py index aa232b6cabd..12e96750ff9 100644 --- a/src/pip/_internal/metadata/__init__.py +++ b/src/pip/_internal/metadata/__init__.py @@ -30,16 +30,19 @@ def _should_use_importlib_metadata() -> bool: """Whether to use the ``importlib.metadata`` or ``pkg_resources`` backend. By default, pip uses ``importlib.metadata`` on Python 3.11+, and - ``pkg_resourcess`` otherwise. This can be overridden by a couple of ways: + ``pkg_resourcess`` On Python <3.13. Up to Python 3.12, This can be + overridden by a couple of ways: * If environment variable ``_PIP_USE_IMPORTLIB_METADATA`` is set, it dictates whether ``importlib.metadata`` is used, regardless of Python version. - * On Python 3.11+, Python distributors can patch ``importlib.metadata`` - to add a global constant ``_PIP_USE_IMPORTLIB_METADATA = False``. This - makes pip use ``pkg_resources`` (unless the user set the aforementioned + * On Python 3.11+, Python distributors can patch ``importlib.metadata`` to + add a global constant ``_PIP_USE_IMPORTLIB_METADATA = False``. This makes + pip use ``pkg_resources`` (unless the user set the aforementioned environment variable to *True*). """ + if sys.version_info >= (3, 13): + return True with contextlib.suppress(KeyError, ValueError): return bool(strtobool(os.environ["_PIP_USE_IMPORTLIB_METADATA"])) if sys.version_info < (3, 11): diff --git a/src/pip/_internal/metadata/importlib/_envs.py b/src/pip/_internal/metadata/importlib/_envs.py index 70cb7a6009a..395350eb6b5 100644 --- a/src/pip/_internal/metadata/importlib/_envs.py +++ b/src/pip/_internal/metadata/importlib/_envs.py @@ -173,9 +173,10 @@ def _iter_distributions(self) -> Iterator[BaseDistribution]: finder = _DistributionFinder() for location in self._paths: yield from finder.find(location) - for dist in finder.find_eggs(location): - _emit_egg_deprecation(dist.location) - yield dist + if sys.version_info < (3, 13): + for dist in finder.find_eggs(location): + _emit_egg_deprecation(dist.location) + yield dist # This must go last because that's how pkg_resources tie-breaks. yield from finder.find_linked(location) diff --git a/tests/functional/test_uninstall.py b/tests/functional/test_uninstall.py index d86ba172002..cfc3a93353b 100644 --- a/tests/functional/test_uninstall.py +++ b/tests/functional/test_uninstall.py @@ -628,6 +628,10 @@ def test_uninstall_with_symlink( assert symlink_target.stat().st_mode == st_mode +@pytest.mark.skipif( + "sys.version_info >= (3, 13)", + reason="Uninstall of .egg distributions not supported in Python 3.13+", +) def test_uninstall_setuptools_develop_install( script: PipTestEnvironment, data: TestData ) -> None: