← Back to issue list

uv plugin fails on core26: dispatch script uses system Python instead of venv

View original Github issue

Metadata

Project
craft-parts
Number
#1641
Type
issue
State
open
Author
zyga
Labels
—
Created
Updated
Closed
—

Current evaluation

core26 has no Python in the base snap, so uv-built parts find no interpreter in the payload and fall back to the system python, leaving venv/bin/python pointing at a bare interpreter that lacks ops. Fix options undecided.

Suggested action: needs triage

Reason: The report has zero comments, no labels, no assignee, and the related charmcraft#2788 was triaged there with a maintainer redirecting ownership, so nothing has been categorised in craft-parts yet. Evidence quality is mixed: the logs and root-cause chain match code that actually exists (base.py's `symlink_target="{python_interpreter}"` fallback after "Python interpreter not found in payload.", uv_plugin.py's `uv venv --relocatable --python {python_ver}`, and `_get_handle_symlinks_commands`' `rm "{venv_dir}"/bin/python*`), so the failure path is real; but the reporter's own framing is unresolved -- four divergent options are offered, including "document that core26 requires additional configuration", so a maintainer must pick between packaging python3 into the payload, not removing the symlinks, or copying the interpreter. Duplicating #1580 does not help since that was closed as a docs fix (merged #1589, acfffd36).

Evaluated by: mr-cal-bot

Impact: 62 Quick Win: 19 Complexity: 58 Confidence: 72 Actionability: 72

Issue body

## Problem The uv plugin fails when building charms on Ubuntu 26.04 (core26) because craft-parts removes python symlinks from `venv/bin/` and the dispatch script's fallback uses the system Python interpreter, which doesn't have venv packages installed. ## Root Cause On core26, the base snap does NOT include Python. The uv plugin flow: 1. Creates a venv with `uv venv --relocatable --python /usr/bin/python3.14` 2. Runs `uv sync` to install dependencies (ops, cosl, etc.) 3. craft-parts removes `python*` symlinks from `venv/bin/` 4. craft-parts tries to find Python in the payload - fails (core26 has no Python) 5. craft-parts falls back to system interpreter path `/usr/bin/python3.14` 6. The dispatch script checks if `venv/bin/python` exists - it doesn't 7. The dispatch script creates `ln -s $(which python3) venv/bin/python` 8. This symlinks to the system Python, which doesn't have `ops` installed Result: `ModuleNotFoundError: No module named 'ops'` at runtime. ## Reproduction ```yaml base: ubuntu@26.04 parts: charm: plugin: uv source: . build-snaps: - astral-uv ``` ## Build Output ``` :: + uv venv --relocatable --allow-existing --python /usr/bin/python3.14 /root/parts/charm/install/venv :: + uv sync --no-dev --no-editable --reinstall --no-install-project :: + rm /root/parts/charm/install/venv/bin/python /root/parts/charm/install/venv/bin/python3 /root/parts/charm/install/venv/bin/python3.14 :: + echo 'Python interpreter not found in payload.' :: Python interpreter not found in payload. :: + symlink_target=/usr/bin/python3.14 ``` The dispatch script then creates `venv/bin/python -> /usr/bin/python3`, which doesn't have venv packages. ## Runtime Error ``` File "/var/lib/juju/agents/unit-image-garden-stream-0/charm/src/charm.py", line 20, in <module> from ops.charm import CharmBase ModuleNotFoundError: No module named 'ops' ``` ## Related - craft-parts #1580 - claims "core26+ and bare are fine" but this shows they are not ## Suggested Fix Options: 1. On core26, automatically include python3 as a dependency in the payload 2. Don't remove python symlinks from venv/bin/ when the interpreter is not in the payload 3. Have craft-parts copy the interpreter to the payload when it's not available 4. Document that core26 requires additional configuration for the uv plugin

Evaluation history

Date Model Scores Action Summary
stealth/space-bunny-alpha
Impact: 62
Quick Win: 19
Complexity: 58
Confidence: 72
Actionability: 72
needs triage core26 has no Python in the base snap, so uv-built parts find no interpreter in the payload and fall back to the system python, leaving venv/bin/python pointing at a bare interpreter that lacks ops. Fix options undecided.
stealth/space-bunny-alpha
Impact: 58
Quick Win: 27
Complexity: 48
Confidence: 91
Actionability: 89
needs triage core26 uv-built charms fall back to system Python after venv links are removed, causing an ops import failure. The bug is reproduced with logs, but remains untriaged in this report and unresolved in related trackers.
stealth/space-bunny-alpha
Impact: 64
Quick Win: 21
Complexity: 59
Confidence: 84
Actionability: 80
needs triage core26 uv charm builds are reported to succeed but fail at startup with missing ops because the system-interpreter fallback bypasses venv packages. A reproduction and logs are supplied; no maintainer triage is recorded.
stealth/space-bunny-alpha
Impact: 58
Quick Win: 24
Complexity: 54
Confidence: 86
Actionability: 91
keep open Triaged but unresolved: core26 uv builds fall back to system Python instead of the dependency-installed venv, causing a runtime ModuleNotFoundError. charmcraft#2788 tracks the same failure.
qwen3.6-35b-a3b-mtp-q6
Impact: 55
Quick Win: 30
Staleness: 50
Complexity: 45
Confidence: 65
Support Request: 15
needs triage uv plugin fails on core26: craft-parts removes python symlinks from venv/bin/ and dispatch script falls back to system Python without venv packages
qwen/qwen3.6-35b-a3b
Staleness: 10
Complexity: 60
Confidence: 90
Support Request: 0
needs triage Bug: uv plugin fails on Ubuntu 26.04 (core26) because craft-parts removes venv Python symlinks and falls back to system Python lacking required packages.
qwen3.6-35b-a3b-mtp-q6
Staleness: 5
Complexity: 65
Confidence: 85
Support Request: 5
needs triage Bug report detailing uv plugin failure on Ubuntu core26 due to craft-parts removing venv Python symlinks and falling back to system Python lacking required packages. Awaiting maintainer review.

Update history

No update history recorded yet.

Related work

  • Duplicate Of: charmcraft#2788 (confidence 93%)

    Identical title and body; that issue is already triaged and open with a maintainer redirecting ownership to Charmcraft. Resolve in one place to avoid parallel threads.

  • Related To: craft-parts#1580 (confidence 85%)

    The reporter's own cross-reference. It was closed by merged PR #1589 (acfffd36), a docs-only change that told users to place unrelated stage-packages in a separate part. This report supplies the runtime evidence that the core26 claim in that doc is wrong, so the docs fix alone does not cover it.

Related issues

Issue Project State Summary Similarity
#2788 uv plugin fails on core26: dispatch script uses system Python instead of venv charmcraft open uv plugin breaks core26 charm builds: craft-parts strips venv python symlinks, dispatch falls back to system Python lacking ops. Acknowledged by lengau, ownership moved into Charmcraft (CHARMCRAFT-714).
87%
#1660 Python plugin fails on core26: base snap does not include Python interpreter craft-parts open core26 lacks a Python runtime, so Python-plugin builds fail unless Python is staged. Documentation covers the workaround, and maintainers are pursuing clearer warning guidance.
71%