Skip to content

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

Description

@zyga

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

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

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions