IRCNF

uv frisst Python's Toolchain — pip, virtualenv, pyenv und poetry in einem Rust-Binary

Teilen:
uv frisst Python's Toolchain — pip, virtualenv, pyenv und poetry in einem Rust-Binary

Python's Toolchain war schon immer seine unbeholfene Teenager-Phase in einem ansonsten reifen Ökosystem. Man brauchte pip für Pakete, virtualenv oder venv für Isolation, pyenv für die Python-Versionsverwaltung und pip-tools oder poetry oder pipenv für das Abhängigkeitslocking. Jedes Tool löste ein Problem und erzeugte Reibung mit den anderen. uv, veröffentlicht von Astral im Februar 2024, ist das erste Tool, das alle diese Probleme löst – und zwar in Rust, mit Geschwindigkeiten, die die vorherige Generation wirken lassen, als liefe sie über eine DFÜ-Verbindung.

Was uv Tatsächlich Ersetzt

Die Vergleichstabelle ist hier wichtig, weil uv nicht nur Funktionen hinzufügt – es eliminiert Tools:

pip install requestsuv pip install requests (10–100x schneller, keine Konfiguration nötig)
python -m venv .venvuv venv (Erstellung virtueller Umgebungen in Millisekunden)
pyenv install 3.12uv python install 3.12 (verwaltete Python-Installationen, pro Projekt fixiert)
poetry add requestsuv add requests (Abhängigkeitsverwaltung mit uv.lock)
pip-compile requirements.inuv pip compile (Erzeugung von Lockfiles)

Die entscheidende Designentscheidung ist ein einzelnes Binary ohne Abhängigkeiten. Sie installieren uv einmal – per curl -LsSf https://astral.sh/uv/install.sh | sh oder per pip – und es übernimmt den gesamten Python-Projektlebenszyklus, ohne dass Python selbst bereits installiert sein muss.

Der Geschwindigkeitsunterschied ist Real

Astral's Benchmarks zeigen, dass uv Pakete 10–100x schneller installiert als pip. Die reale Erfahrung ist bei kleinen Installationen weniger dramatisch, aber im großen Maßstab verblüffend. Eine Kaltinstallation einer Data-Science-Umgebung (numpy, pandas, scikit-learn, matplotlib, jupyter), die mit pip 45-90 Sekunden dauert, benötigt mit uv auf demselben Rechner unter 5 Sekunden, hauptsächlich weil uv Downloads parallelisiert und den Abhängigkeitsgraphen in Rust statt in Python auflöst. In CI-Systemen, wo Abhängigkeiten häufig von Grund auf neu installiert werden, summiert sich dieser Unterschied über jeden Pipeline-Lauf.

Der Abhängigkeitsauflöser ist auch in einer Weise korrekt, wie pip es nicht war. pips Auflöser hatte historisch gesehen Grenzfälle, in denen er widersprüchliche Abhängigkeiten ohne Fehler installierte; uvs Auflöser, der den PubGrub-Algorithmus (den gleichen, den Darts Paketmanager pub verwendet) nutzt, garantiert, dass wenn eine Lösung existiert, er sie findet, und wenn nicht, gibt er einen präzisen Fehler aus, der erklärt, welche Constraints in Konflikt stehen.

Das uv.lock-Format und Reproduzierbarkeit

uv führte ein eigenes Lockfile-Format (uv.lock) ein, das den vollständigen, aufgelösten Abhängigkeitsgraphen inklusive Hashes für jedes Paket erfasst. Dies ist das fehlende Stück, das die bisherige Python-Abhängigkeitsverwaltung im großen Maßstab unreproduzierbar machte. Eine requirements.txt mit nicht fixierten transitiven Abhängigkeiten war immer eine Zeitbombe – sie würde sich auf verschiedenen Maschinen oder zu verschiedenen Zeiten unterschiedlich installieren, sobald Upstream-Pakete aktualisiert wurden. uv.lock ist plattformübergreifend und kodiert die Auflösung pro Plattform, sodass dieselbe Lockdatei unter Linux, macOS und Windows funktioniert, ohne separate Lockfiles pro Betriebssystem.

Übernahme im Ökosystem

Die Übernahme von uv war schneller als fast jedes Python-Tool in jüngster Erinnerung. Der öffentliche Abhängigkeitsgraph von GitHub zeigt uv innerhalb von Monaten nach der Veröffentlichung in CI-Konfigurationen großer Open-Source-Projekte. Die offizielle Dokumentation von FastAPI wechselte Mitte 2024 ihre empfohlene Entwicklungseinrichtung auf uv. Das Jupyter-Team evaluiert uv für die Notebook-Umgebungsverwaltung. Die Python Packaging Authority (PyPA) hat kein einzelnes Tool offiziell befürwortet, aber mehrere PyPA-Mitglieder haben uv öffentlich in ihren eigenen Projekten übernommen.

Der Fall des Festhaltens an poetry oder pip-tools ist hauptsächlich die Lockfile-Kompatibilität – Teams, die vorhandene poetry.lock-Dateien in ihren Workflows eingebettet haben, sehen sich mit Migrationshürden konfrontiert. uv kann aus requirements.txt und pyproject.toml importieren, aber poetry.lock nicht direkt konsumieren, was bedeutet, dass die Übernahme in ausgereiften Codebasen einen Lockfile-Migrationsschritt erfordert.

Die Rye-Frage

Astral pflegt auch Rye, ein übergeordnetes Projektmanagement-Tool. Die Beziehung zwischen uv und Rye hat sich geklärt: uv ist die grundlegende Schicht und Rye konvergiert auf uv als sein Backend. Armin Ronacher (Schöpfer von Flask), der Rye baute, übertrug das Projekt an Astral mit der ausdrücklichen Erwartung, dass uv es irgendwann ersetzen würde. Für neue Projekte wird direkt uv empfohlen. Rye bleibt für Teams nützlich, die es bereits verwenden, ist aber nicht der Fokus der aktiven Entwicklung.

Teilen:
uv frisst Python's Toolchain — pip, virtualenv, pyenv und poetry in einem Rust-Binary | IRCNF - Intelligent Reliable Custom Next-gen Frameworks