Fix best-interpreter lookups when there is an invalid interpreter in the PATH (#11030)

Closes https://github.com/astral-sh/uv/issues/10978

The root cause is the same as #10908 — I should have been more careful
with the original change.
This commit is contained in:
Zanie Blue 2025-01-28 13:44:32 -06:00 committed by GitHub
parent 4b8e157ba7
commit e26affd27c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 38 additions and 15 deletions

View file

@ -1074,10 +1074,16 @@ pub fn find_best_python_installation(
// First, check for an exact match (or the first available version if no Python version was provided)
debug!("Looking for exact match for request {request}");
let result = find_python_installation(request, environments, preference, cache)?;
if let Ok(ref installation) = result {
let result = find_python_installation(request, environments, preference, cache);
match result {
Ok(Ok(installation)) => {
warn_on_unsupported_python(installation.interpreter());
return Ok(result);
return Ok(Ok(installation));
}
// Continue if we can't find a matching Python and ignore non-critical discovery errors
Ok(Err(_)) => {}
Err(ref err) if !err.is_critical() => {}
_ => return result,
}
// If that fails, and a specific patch version was requested try again allowing a
@ -1096,10 +1102,16 @@ pub fn find_best_python_installation(
_ => None,
} {
debug!("Looking for relaxed patch version {request}");
let result = find_python_installation(&request, environments, preference, cache)?;
if let Ok(ref installation) = result {
let result = find_python_installation(&request, environments, preference, cache);
match result {
Ok(Ok(installation)) => {
warn_on_unsupported_python(installation.interpreter());
return Ok(result);
return Ok(Ok(installation));
}
// Continue if we can't find a matching Python and ignore non-critical discovery errors
Ok(Err(_)) => {}
Err(ref err) if !err.is_critical() => {}
_ => return result,
}
}

View file

@ -1412,16 +1412,27 @@ fn compile_fallback_interpreter_broken_in_path() -> Result<()> {
.arg("3.12")
// In tests, we ignore `PATH` during Python discovery so we need to add the context `bin`
.env("UV_TEST_PYTHON_PATH", context.bin_dir.as_os_str()), @r###"
success: false
exit_code: 2
success: true
exit_code: 0
----- stdout -----
# This file was autogenerated by uv via the following command:
# uv pip compile --cache-dir [CACHE_DIR] requirements.in --python-version 3.12
black==23.10.[X]
# via -r requirements.in
click==8.1.7
# via black
mypy-extensions==1.0.0
# via black
packaging==24.0
# via black
pathspec==0.12.1
# via black
platformdirs==4.2.0
# via black
----- stderr -----
error: Failed to inspect Python interpreter from search path at `[BIN]/python3`
Caused by: Querying Python at `[BIN]/python3` failed with exit status exit status: 1
[stderr]
error: intentionally broken python executable
warning: The requested Python version 3.12 is not available; 3.10.[X] will be used to build dependencies instead.
Resolved 6 packages in [TIME]
"###
);