diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 78627a015..75e446e97 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -691,17 +691,9 @@ jobs: - name: "Prepare binary" run: chmod +x ./uv - - name: "Create a virtual environment" + - name: "Check missing distutils" run: | - ./uv venv -p 3.9 --python-preference only-system - - - name: "Check version" - run: | - .venv/bin/python --version - - - name: "Check install missing distutils" - run: | - ./uv pip install -v anyio 2>&1 | tee log.txt || true + ./uv venv -p 3.9 --python-preference only-system -v 2>&1 | tee log.txt || true # We should report that distutils is missing grep 'Python installation is missing `distutils`' log.txt @@ -709,10 +701,17 @@ jobs: run: | sudo apt-get install python3.9-distutils + - name: "Create a virtualenv" + run: | + ./uv venv -p 3.9 --python-preference only-system -v + + - name: "Check version" + run: | + .venv/bin/python --version + - name: "Check install" run: | ./uv pip install -v anyio - # Now the install should succeed integration-test-free-threaded-linux: timeout-minutes: 5 diff --git a/crates/uv-python/python/get_interpreter_info.py b/crates/uv-python/python/get_interpreter_info.py index 86db1d4fe..1054fae64 100644 --- a/crates/uv-python/python/get_interpreter_info.py +++ b/crates/uv-python/python/get_interpreter_info.py @@ -176,6 +176,9 @@ def get_virtualenv(): "data": expand_path(sysconfig_paths["data"]), } else: + # Use distutils primarily because that's what pip does. + # https://github.com/pypa/pip/blob/ae5fff36b0aad6e5e0037884927eaa29163c0611/src/pip/_internal/locations/__init__.py#L249 + # 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 @@ -189,8 +192,6 @@ def get_virtualenv(): 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 with warnings.catch_warnings(): # disable warning for PEP-632 @@ -337,19 +338,6 @@ def get_scheme(use_sysconfig_scheme: bool): 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 @@ -575,6 +563,19 @@ def main() -> None: # If we're not using sysconfig, make sure distutils is available. if not use_sysconfig_scheme: try: + # 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 distutils.dist except ImportError: # We require distutils, but it's not installed; this is fairly