From ff62fe2c0b3adb55fa26fd1b57e8d7a1c324f549 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 8 Mar 2024 11:53:49 -0800 Subject: [PATCH] Avoid using setuptools shim of distutils (#2305) ## Summary It turns out that setuptools includes a shim to patch distutils. I'll admit that I don't fully understand why or how it's different, but this is the trick `pip` uses to ensure that it gets the "original" distutils. We actually use distutils in two places: once for the system Python scheme, and once for virtual environments. In virtualenv, they _do_ use the patched distutils, so this could deviate in ways I don't understand. Closes #2302. --- .../src/get_interpreter_info.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/crates/uv-interpreter/src/get_interpreter_info.py b/crates/uv-interpreter/src/get_interpreter_info.py index 4d4b4f2b4..0b1d6fe96 100644 --- a/crates/uv-interpreter/src/get_interpreter_info.py +++ b/crates/uv-interpreter/src/get_interpreter_info.py @@ -169,6 +169,19 @@ def get_virtualenv(): "data": expand_path(sysconfig_paths["data"]), } else: + # Disable the use of the setuptools shim, if it's injected. Per pip: + # + # > If pip's going to use distutils, it should not be using the copy that setuptools + # > might have injected into the environment. This is done by removing the injected + # > shim, if it's injected. + # + # > See https://github.com/pypa/pip/issues/8761 for the original discussion and + # > rationale for why this is done within pip. + try: + __import__("_distutils_hack").remove_shim() + except (ImportError, AttributeError): + pass + # Use distutils primarily because that's what pip does. # https://github.com/pypa/pip/blob/ae5fff36b0aad6e5e0037884927eaa29163c0611/src/pip/_internal/locations/__init__.py#L249 import warnings @@ -317,6 +330,19 @@ def get_scheme(): Based on (with default arguments): https://github.com/pypa/pip/blob/ae5fff36b0aad6e5e0037884927eaa29163c0611/src/pip/_internal/locations/_distutils.py#L115 """ + # Disable the use of the setuptools shim, if it's injected. Per pip: + # + # > If pip's going to use distutils, it should not be using the copy that setuptools + # > might have injected into the environment. This is done by removing the injected + # > shim, if it's injected. + # + # > See https://github.com/pypa/pip/issues/8761 for the original discussion and + # > rationale for why this is done within pip. + try: + __import__("_distutils_hack").remove_shim() + except (ImportError, AttributeError): + pass + import warnings with warnings.catch_warnings(): # disable warning for PEP-632