diff --git a/news/11501.process.rst b/news/11501.process.rst new file mode 100644 index 00000000000..af6dbb47417 --- /dev/null +++ b/news/11501.process.rst @@ -0,0 +1,6 @@ +Prevent the ``pkg_resources`` metadata backend from being used on Python 3.12 +or later. This backend exists for backward compatibility, and should only be +used on newer Python versions by Python distributors that cannot correctly +implement ``importlib.metadata`` support in a timely fashion. Time is up for +transition since CPython is now removing mechanisms that ``pkg_resource`` +relies on, and the backend will no longer work on Python 3.12 or later. diff --git a/src/pip/_internal/metadata/__init__.py b/src/pip/_internal/metadata/__init__.py index 9f73ca7105f..8ab78a3065b 100644 --- a/src/pip/_internal/metadata/__init__.py +++ b/src/pip/_internal/metadata/__init__.py @@ -30,7 +30,8 @@ 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_resources`` otherwise. On Python versions prior to 3.12, this can be + overridden by a couple of ways for transitional purposes: * If environment variable ``_PIP_USE_IMPORTLIB_METADATA`` is set, it dictates whether ``importlib.metadata`` is used, regardless of Python @@ -40,6 +41,8 @@ def _should_use_importlib_metadata() -> bool: makes pip use ``pkg_resources`` (unless the user set the aforementioned environment variable to *True*). """ + if sys.version_info >= (3, 12): + return True with contextlib.suppress(KeyError, ValueError): return bool(strtobool(os.environ["_PIP_USE_IMPORTLIB_METADATA"])) if sys.version_info < (3, 11):