Skip to content

Commit

Permalink
Never use the pkg_resources backend on python 3.13+
Browse files Browse the repository at this point in the history
  • Loading branch information
sbidoul committed Oct 13, 2024
1 parent b0ebea9 commit 0e81b3c
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 7 deletions.
2 changes: 2 additions & 0 deletions news/13010.removal.rst
Original file line number Diff line number Diff line change
@@ -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.
11 changes: 7 additions & 4 deletions src/pip/_internal/metadata/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
7 changes: 4 additions & 3 deletions src/pip/_internal/metadata/importlib/_envs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
4 changes: 4 additions & 0 deletions tests/functional/test_uninstall.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down

0 comments on commit 0e81b3c

Please sign in to comment.