Skip to content

allow running non-default Python interpreters directly via uvx #13583

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
May 30, 2025

Conversation

oconnor663
Copy link
Contributor

@oconnor663 oconnor663 commented May 21, 2025

Previously if you wanted to run e.g. PyPy via uvx, you had to spell it like uvx -p pypy python. Now we reuse the PythonRequest::parse machinery to handle the executable, so all of the following examples work:

The python (and on Windows only, pythonw) special cases are retained, which normally aren't allowed values of -p/--python.

Closes #13536.


The initial version of this PR has 3 failing snapshot tests. The common issue is that this @ syntax used to work:

$ uvx [email protected]
Python 3.8.20 (default, Oct  2 2024, 16:34:12) 
[Clang 18.1.8 ] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

But now it does this:

$ uvx [email protected]
× No solution found when resolving tool dependencies:
  ╰─▶ Because python was not found in the package registry and you require python==3.8, we can conclude that your requirements are unsatisfiable.

The underlying reason for the change is that we used to parse the executable with Target::parse, but in this PR we parse the executable with PythonRequest::parse. The latter doesn't recognize [email protected] at all, and it returns the catch-all PythonRequest::ExecutableName variant, which we take to mean that the executable is a package and not an interpreter.

There are several different ways we could handle this, and I'm not sure what's best. Reviewer feedback needed :)

  • We could break back compat and stop supporting uvx [email protected]. Note that either way, uvx python3.8, uvx python38, and even uvx 38 all work under this PR. (The last one there might be even more flexible than we want? That's another potential reviewer question.) I'm not sure how widely the current syntax is used, but I'd guess it's more widely used than uvx -p python3.8 python?
  • We could expand the special case in ToolRequest::parse (previously is_python) to support [email protected] in addition to bare python. (Update: We ended up expanding ToolRequest::parse and refactoring some of the PythonRequest::parse machinery to minimize duplication.)
  • We could expand PythonRequest::parse to support [email protected], possibly by adding "python" to ImplementationName::long_names as an aslias for "cpython". This would allow e.g. uvx --python [email protected] ruff, which isn't currently allowed in main or in this PR, and which might not be desirable?

@oconnor663 oconnor663 requested review from Gankra and zanieb May 21, 2025 20:15
@Gankra
Copy link
Contributor

Gankra commented May 21, 2025

We could expand the special case in ToolRequest::parse (previously is_python) to support [email protected] in addition to bare python.

After some checking this feels like the best option of the 3 you laid out. I don't want to break compat without a really good reason, and PythonRequest::parse is called pervasively throughout our CLI, so changing that would have widespread ramifications.

Copy link
Contributor

@Gankra Gankra left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The implementation seems reasonable. In an ideal world we could fail one of the parsers and simply fallback to the other to preserve the old behaviour, but I guess the parsers are too flexible for that.

@zanieb
Copy link
Member

zanieb commented May 21, 2025

We could expand the special case in ToolRequest::parse (previously is_python) to support [email protected] in addition to bare python.

After some checking this feels like the best option of the 3 you laid out. I don't want to break compat without a really good reason, and PythonRequest::parse is called pervasively throughout our CLI, so changing that would have widespread ramifications.

I actually just suggested that we want consistent Python parsing throughout and python is a reasonable alias for cpython, so uv run -p [email protected] seems okay and I think the last option is what I'd lean towards unless there are other tool-specific special cases we need to implement anyway.

Comment on lines 51 to 52
// e.g. `python3`, `python3.12`, or in fact `312`
PythonRequest::Version(_) |
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think a bare version (e.g., 312 or 3.12) should work, but I do think python3 and python3.12 should work.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This suggests that maybe PythonRequest isn't quite right since it drops that information? You could add variants like Interpreter (i.e., bare python) and InterpreterVersion (i.e., python3.13) (names questionable), but that's a fair amount of work since you'd need to handle them everywhere.

@oconnor663
Copy link
Contributor Author

We could expand the special case in ToolRequest::parse (previously is_python) to support [email protected] in addition to bare python.

After some checking this feels like the best option of the 3 you laid out. I don't want to break compat without a really good reason, and PythonRequest::parse is called pervasively throughout our CLI, so changing that would have widespread ramifications.

I chatted with @zanieb just now, and they were leaning towards the third option of allowing e.g. --python [email protected] everywhere (maybe by adding it to long_names and calling it an alias for "cpython"), which would fix my broken tests as a side effect. At the same time, uvx 38 seems like too much to allow, because we'd be implicitly shadowing a large class of possible package names. I'm going to noodle on whether I can factor out what we want from PythonRequest::parse, and/or whether we might want something like uv run's --script flag that callers with "interesting" internal package names can use to prevent shadowing. (The natural choice might be --package but alas that's already taken.)

@zanieb
Copy link
Member

zanieb commented May 21, 2025

On

whether we might want something like uv run's --script flag that callers with "interesting" internal package names can use to prevent shadowing.

I mostly brought that up to explain our general thinking and existing patterns for that problem. I probably wouldn't pursue adding that here.

@zanieb zanieb added the enhancement New feature or improvement to existing functionality label May 21, 2025
@zanieb zanieb self-assigned this May 21, 2025
@oconnor663 oconnor663 assigned oconnor663 and unassigned zanieb May 22, 2025
@oconnor663 oconnor663 force-pushed the jack/uvx_pypy branch 2 times, most recently from fc195e7 to a1f7461 Compare May 22, 2025 22:33
@oconnor663
Copy link
Contributor Author

oconnor663 commented May 22, 2025

Second pass: I've factored out an alternate constructor for PythonRequest called try_parse_tool_executable. This shares parsing logic for cases that are (now) common between --python and uvx (python3.8, [email protected], pypy38) but allows for cases that are unique to --python (38, cp@38) or to uvx (python, pythonw on Windows). If the differences get any more complicated than this, it might be better to give up the sharing and just copy-paste the parser, but as-is it doesn't feel too bad. The match statement where I was seeing which variant of PythonRequest we got is thankfully gone.

There is one remaining failing snapshot test: tool_run_python_from

#[test]
fn tool_run_python_from() {
let context = TestContext::new_with_versions(&["3.12", "3.11"])
.with_filtered_counts()
.with_filtered_python_sources();
uv_snapshot!(context.filters(), context.tool_run()
.arg("--from")
.arg("python")
.arg("python")
.arg("--version"), @r###"
success: true
exit_code: 0
----- stdout -----
Python 3.12.[X]
----- stderr -----
Resolved in [TIME]
Audited in [TIME]
"###);
uv_snapshot!(context.filters(), context.tool_run()
.arg("--from")
.arg("[email protected]")
.arg("python")
.arg("--version"), @r###"
success: true
exit_code: 0
----- stdout -----
Python 3.11.[X]
----- stderr -----
Resolved in [TIME]
Audited in [TIME]
"###);
uv_snapshot!(context.filters(), context.tool_run()
.arg("--from")
.arg("python>=3.12")
.arg("python")
.arg("--version"), @r###"
success: false
exit_code: 2
----- stdout -----
----- stderr -----
error: Using `--from python<specifier>` is not supported. Use `python@<version>` instead.
"###);
}

This tests cases like uvx --from [email protected] python. That's similar to uvx --python python3.8 python (which is still supported and now allows the @ syntax too), but it actually ignores the executable argument entirely. For example with the currently released version:

$ uvx --from python@38 blargblargblarg
Python 3.8.20 (default, Oct  2 2024, 16:34:12) 
[Clang 18.1.8 ] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

I'm not sure what to do with this. We could keep supporting it, but it seems kind of bizarre. Does anyone use this? (If it was important enough to be in the snapshot tests I fear the answer is yes.) Feedback needed.

Update: Zanie clarified that --from python is important for use cases like uvx --from python bash, which runs bash from the PATH with Python available. I added support below.

@@ -1447,7 +1430,7 @@ impl PythonRequest {
return Self::File(value_as_path);
}

// e.g. path/to/python on Windows, where path/to/python is the true path
// e.g. path/to/python on Windows, where path/to/python.exe is the true path
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Drive by: this is what was intended right?

@oconnor663 oconnor663 assigned zanieb and unassigned oconnor663 May 22, 2025
@Gankra
Copy link
Contributor

Gankra commented May 23, 2025

I'm not sure what to do with this. We could keep supporting it, but it seems kind of bizarre. Does anyone use this? (If it was important enough to be in the snapshot tests I fear the answer is yes.) Feedback needed.

This was added in #11076 but the PR/issue focuses on non-from usage. That said, zanie added explicit snapshots for it, and one error for "hey what are you doing", so pretty clear they were going eyes wide-open into it.

The fact that the second argument gets ignored seems like a bug though... at very least we should probably error if it's not python?

Previously if you wanted to run e.g. PyPy via `uvx`, you had to spell it
like `uvx -p pypy python`. Now we share (some of) the
PythonRequest::parse machinery to handle the executable, so all of the
following examples work:

- uvx python
- uvx python3.8
- uvx 38
- uvx pypy
- uvx [email protected]
- uvx graalpy
- uvx [email protected]

The `python` (and on Windows only, `pythonw`) special cases are
retained, which normally aren't allowed values of `-p`/`--python`.
However, the following examples deliberately *don't* work. Instead we
interpret these arguments as package names. (The `pp` package exists,
and we try to run it, but it fails to build.)

- uvx 38
- uvp pp
- uvp pp38

Closes #13536.
oconnor663 and others added 2 commits May 27, 2025 15:54
Co-authored-by: Zanie Blue <[email protected]>
Co-authored-by: Zanie Blue <[email protected]>
@oconnor663 oconnor663 temporarily deployed to uv-test-publish May 27, 2025 22:57 — with GitHub Actions Inactive
Note that this is somewhat broken in the currently release v0.7.8. `uvx
run --from python bash` executes Python instead of Bash, because the
executable is totally ignored. This commit also fixes that bug.
@oconnor663 oconnor663 temporarily deployed to uv-test-publish May 27, 2025 23:59 — with GitHub Actions Inactive
Copy link
Member

@konstin konstin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just some drive-by comments

----- stderr -----
× No solution found when resolving tool dependencies:
╰─▶ Because cp311 was not found in the package registry and you require cp311, we can conclude that your requirements are unsatisfiable.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this snapshot break when someone publishes cp311 to PyPI?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but we should squat or advocate for those names to be banned.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is my first time using snapshot testing, so a broad philosophy question: How do we feel about "brittleness" in snapshots? Is it just as bad as brittleness in regular tests, or is it more acceptable?

Copy link
Member

@zanieb zanieb May 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's just as bad, really. We try to make them reproducible wherever possible. That's mostly w.r.t. the external world though, internal changes causing snapshot changes are fine.

However, I think this specific case is fine.

@oconnor663 oconnor663 temporarily deployed to uv-test-publish May 28, 2025 15:10 — with GitHub Actions Inactive
@oconnor663 oconnor663 temporarily deployed to uv-test-publish May 28, 2025 15:22 — with GitHub Actions Inactive
Comment on lines 1952 to 2048
error: Requesting the 'latest' Python version is not yet supported
"###);
error: Invalid version request: latest
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems like a regression, and would be confusing since we do support, e.g., ruff@latest.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you say more here? To me it looks like something that was an error before is still an error, with a different message. PythonRequest doesn't currently have a Latest variant, so that would need to be implemented if we wanted to support it in this PR.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change in message here is a regression because it moves from a clear error message to a misleading one. Previously, we explained that latest was not supported for python requests. Here, we say latest is an invalid version request, but... that's not true in the general case because we support it for non-python requests, like ruff@latest.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines 2002 to 2113
error: Using `--from python<specifier>` is not supported. Use `python@<version>` instead.
"###);
error: Using `--from python<range>` is not supported. Use `python<version>` or `python@<version>` instead.
");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Separate, but we should open an issue to follow-up on this. uvx -p >=3.12 python is valid and probably a better recommendation? Also I'm not sure why we wouldn't support python>=3.12 here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure exactly how, but I'd gotten the impression that we didn't want to support this. If we do, I think I can just remove this check:

if matches!(request, PythonRequest::Version(VersionRequest::Range(..))) {
return Err(anyhow::anyhow!(
"Using `{}` is not supported. Use `{}` or `{}` instead.",
"--from python<range>".cyan(),
"python<version>".cyan(),
"python@<version>".cyan(),
)
.into());
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

@zanieb zanieb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@oconnor663 oconnor663 temporarily deployed to uv-test-publish May 29, 2025 03:57 — with GitHub Actions Inactive
@oconnor663 oconnor663 temporarily deployed to uv-test-publish May 29, 2025 15:13 — with GitHub Actions Inactive
@oconnor663
Copy link
Contributor Author

Also, @Gankra @konstin any more comments?

@oconnor663 oconnor663 assigned Gankra and konstin and unassigned zanieb May 29, 2025
@konstin
Copy link
Member

konstin commented May 30, 2025

I'll leave the design review to zanie, code LGTM.

@oconnor663 oconnor663 temporarily deployed to uv-test-publish May 30, 2025 14:36 — with GitHub Actions Inactive
@oconnor663 oconnor663 merged commit 7310ea7 into main May 30, 2025
86 checks passed
@oconnor663 oconnor663 deleted the jack/uvx_pypy branch May 30, 2025 16:12
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jun 13, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [astral-sh/uv](https://github.com/astral-sh/uv) | patch | `0.7.7` -> `0.7.13` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>astral-sh/uv (astral-sh/uv)</summary>

### [`v0.7.13`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0713)

[Compare Source](astral-sh/uv@0.7.12...0.7.13)

##### Python

-   Add Python 3.14.0b2
-   Add Python 3.13.5
-   Fix stability of `uuid.getnode` on 3.13

See the
[`python-build-standalone` release notes](https://github.com/astral-sh/python-build-standalone/releases/tag/20250612)
for more details.

##### Enhancements

-   Download versions in `uv python pin` if not found ([#&#8203;13946](astral-sh/uv#13946))
-   Use TTY detection to determine if SIGINT forwarding is enabled ([#&#8203;13925](astral-sh/uv#13925))
-   Avoid fetching an exact, cached Git commit, even if it isn't locked ([#&#8203;13748](astral-sh/uv#13748))
-   Add `zstd` and `deflate` to `Accept-Encoding` ([#&#8203;13982](astral-sh/uv#13982))
-   Build binaries for riscv64  ([#&#8203;12688](astral-sh/uv#12688))

##### Bug fixes

-   Check if relative URL is valid directory before treating as index ([#&#8203;13917](astral-sh/uv#13917))
-   Ignore Python discovery errors during `uv python pin` ([#&#8203;13944](astral-sh/uv#13944))
-   Do not allow `uv add --group ... --script` ([#&#8203;13997](astral-sh/uv#13997))

##### Preview changes

-   Build backend: Support namespace packages ([#&#8203;13833](astral-sh/uv#13833))

##### Documentation

-   Add 3.14 to the supported platform reference ([#&#8203;13990](astral-sh/uv#13990))
-   Add an `llms.txt` to uv ([#&#8203;13929](astral-sh/uv#13929))
-   Add supported macOS version to the platform reference ([#&#8203;13993](astral-sh/uv#13993))
-   Update platform support reference to include Python implementation list ([#&#8203;13991](astral-sh/uv#13991))
-   Update pytorch.md ([#&#8203;13899](astral-sh/uv#13899))
-   Update the CLI help and reference to include references to the Python bin directory ([#&#8203;13978](astral-sh/uv#13978))

### [`v0.7.12`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0712)

[Compare Source](astral-sh/uv@0.7.11...0.7.12)

##### Enhancements

-   Add `uv python pin --rm` to remove `.python-version` pins ([#&#8203;13860](astral-sh/uv#13860))
-   Don't hint at versions removed by `excluded-newer` ([#&#8203;13884](astral-sh/uv#13884))
-   Add hint to use `tool.uv.environments` on resolution error ([#&#8203;13455](astral-sh/uv#13455))
-   Add hint to use `tool.uv.required-environments` on resolution error ([#&#8203;13575](astral-sh/uv#13575))
-   Improve `python pin` error messages ([#&#8203;13862](astral-sh/uv#13862))

##### Bug fixes

-   Lock environments during `uv sync`, `uv add` and `uv remove` to prevent race conditions ([#&#8203;13869](astral-sh/uv#13869))
-   Add `--no-editable` to `uv export` for `pylock.toml` ([#&#8203;13852](astral-sh/uv#13852))

##### Documentation

-   List `.gitignore` in project init files ([#&#8203;13855](astral-sh/uv#13855))
-   Move the pip interface documentation into the concepts section ([#&#8203;13841](astral-sh/uv#13841))
-   Remove the configuration section in favor of concepts / reference ([#&#8203;13842](astral-sh/uv#13842))
-   Update Git and GitHub Actions docs to mention `gh auth login` ([#&#8203;13850](astral-sh/uv#13850))

##### Preview

-   Fix directory glob traversal fallback preventing exclusion of all files ([#&#8203;13882](astral-sh/uv#13882))

### [`v0.7.11`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0711)

[Compare Source](astral-sh/uv@0.7.10...0.7.11)

##### Python

-   Add Python 3.14.0b1
-   Add Python 3.13.4
-   Add Python 3.12.11
-   Add Python 3.11.13
-   Add Python 3.10.18
-   Add Python 3.9.23

##### Enhancements

-   Add Pyodide support ([#&#8203;12731](astral-sh/uv#12731))
-   Better error message for version specifier with missing operator ([#&#8203;13803](astral-sh/uv#13803))

##### Bug fixes

-   Downgrade `reqwest` and `hyper-util` to resolve connection reset errors over IPv6 ([#&#8203;13835](astral-sh/uv#13835))
-   Prefer `uv`'s binary's version when checking if it's up to date ([#&#8203;13840](astral-sh/uv#13840))

##### Documentation

-   Use "terminal driver" instead of "shell" in `SIGINT` docs ([#&#8203;13787](astral-sh/uv#13787))

### [`v0.7.10`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0710)

[Compare Source](astral-sh/uv@0.7.9...0.7.10)

##### Enhancements

-   Add `--show-extras` to `uv tool list` ([#&#8203;13783](astral-sh/uv#13783))
-   Add dynamically generated sysconfig replacement mappings ([#&#8203;13441](astral-sh/uv#13441))
-   Add data locations to install wheel logs ([#&#8203;13797](astral-sh/uv#13797))

##### Bug fixes

-   Avoid redaction of placeholder `git` username when using SSH authentication ([#&#8203;13799](astral-sh/uv#13799))
-   Propagate credentials to files on devpi indexes ending in `/+simple` ([#&#8203;13743](astral-sh/uv#13743))
-   Restore retention of credentials for direct URLs in `uv export` ([#&#8203;13809](astral-sh/uv#13809))

### [`v0.7.9`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#079)

[Compare Source](astral-sh/uv@0.7.8...0.7.9)

##### Python

The changes reverted in [0.7.8](#&#8203;078) have been restored.

See the
[`python-build-standalone` release notes](https://github.com/astral-sh/python-build-standalone/releases/tag/20250529)
for more details.

##### Enhancements

-   Improve obfuscation of credentials in URLs ([#&#8203;13560](astral-sh/uv#13560))
-   Allow running non-default Python implementations via `uvx` ([#&#8203;13583](astral-sh/uv#13583))
-   Add `uvw` as alias for `uv` without console window on Windows ([#&#8203;11786](astral-sh/uv#11786))
-   Allow discovery of x86-64 managed Python builds on macOS ([#&#8203;13722](astral-sh/uv#13722))
-   Differentiate between implicit vs explicit architecture requests ([#&#8203;13723](astral-sh/uv#13723))
-   Implement ordering for Python architectures to prefer native installations ([#&#8203;13709](astral-sh/uv#13709))
-   Only show the first match per platform (and architecture) by default in `uv python list`  ([#&#8203;13721](astral-sh/uv#13721))
-   Write the path of the parent environment to an `extends-environment` key in the `pyvenv.cfg` file of an ephemeral environment ([#&#8203;13598](astral-sh/uv#13598))
-   Improve the error message when libc cannot be found, e.g., when using the distroless containers ([#&#8203;13549](astral-sh/uv#13549))

##### Performance

-   Avoid rendering info log level ([#&#8203;13642](astral-sh/uv#13642))
-   Improve performance of `uv-python` crate's manylinux submodule ([#&#8203;11131](astral-sh/uv#11131))
-   Optimize `Version` display ([#&#8203;13643](astral-sh/uv#13643))
-   Reduce number of reference-checks for `uv cache clean` ([#&#8203;13669](astral-sh/uv#13669))

##### Bug fixes

-   Avoid reinstalling dependency group members with `--all-packages` ([#&#8203;13678](astral-sh/uv#13678))
-   Don't fail direct URL hash checking with dependency metadata ([#&#8203;13736](astral-sh/uv#13736))
-   Exit early on `self update` if global `--offline` is set ([#&#8203;13663](astral-sh/uv#13663))
-   Fix cases where the uv lock is incorrectly marked as out of date ([#&#8203;13635](astral-sh/uv#13635))
-   Include pre-release versions in `uv python install --reinstall` ([#&#8203;13645](astral-sh/uv#13645))
-   Set `LC_ALL=C` for git when checking git worktree ([#&#8203;13637](astral-sh/uv#13637))
-   Avoid rejecting Windows paths for remote Python download JSON targets ([#&#8203;13625](astral-sh/uv#13625))

##### Preview

-   Add `uv add --bounds` to configure version constraints ([#&#8203;12946](astral-sh/uv#12946))

##### Documentation

-   Add documentation about Python versions to Tools concept page ([#&#8203;7673](astral-sh/uv#7673))
-   Add example of enabling Dependabot ([#&#8203;13692](astral-sh/uv#13692))
-   Fix `exclude-newer` date format for persistent configuration files ([#&#8203;13706](astral-sh/uv#13706))
-   Quote versions variables in GitLab documentation ([#&#8203;13679](astral-sh/uv#13679))
-   Update Dependabot support status ([#&#8203;13690](astral-sh/uv#13690))
-   Explicitly specify to add a new repo entry to the repos list item in the `.pre-commit-config.yaml` ([#&#8203;10243](astral-sh/uv#10243))
-   Add integration with marimo guide ([#&#8203;13691](astral-sh/uv#13691))
-   Add pronunciation to README ([#&#8203;5336](astral-sh/uv#5336))

### [`v0.7.8`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#078)

[Compare Source](astral-sh/uv@0.7.7...0.7.8)

##### Python

We are reverting most of our Python changes from `uv 0.7.6` and `uv 0.7.7` due to
a miscompilation that makes the Python interpreter behave incorrectly, resulting
in spurious type-errors involving str. This issue seems to be isolated to
x86\_64 Linux, and affected at least Python 3.12, 3.13, and 3.14.

The following changes that were introduced in those versions of uv are temporarily
being reverted while we test and deploy a proper fix for the miscompilation:

-   Add Python 3.14 on musl
-   free-threaded Python on musl
-   Add Python 3.14.0a7
-   Statically link `libpython` into the interpreter on Linux for a significant performance boost

See [the issue for details](astral-sh/uv#13610).

##### Documentation

-   Remove misleading line in pin documentation ([#&#8203;13611](astral-sh/uv#13611))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4yNi4xIiwidXBkYXRlZEluVmVyIjoiNDAuNTEuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or improvement to existing functionality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add support for uvx pypy
4 participants