Rye: Ein Python-Erlebnis ohne Aufwand
(rye.astral.sh)- Rye war ein Projekt- und Paketverwaltungswerkzeug, das Python-Installationen,
pyproject.toml-Projekte, Abhängigkeiten, virtuelle Umgebungen und die Installation globaler Tools an einem Ort verwalten sollte - Die Entwicklung wurde inzwischen eingestellt, und stattdessen wird die Nutzung des Nachfolgeprojekts uv empfohlen, das von denselben Maintainern entwickelt wird
- Bestehende Nutzer können mithilfe des uv migration guide migrieren; Rye kann weiterhin bezogen werden, aber es sind keine weiteren Updates geplant
- Das Ende der Updates umfasst auch Sicherheitsupdates, daher sollte für neue Projekte oder langfristige Wartungsumgebungen ein Wechsel zu uv in Betracht gezogen werden
- Die integrierte Python-Erfahrung, die Rye anstrebte, umfasste auch komplexe Projekte und Monorepos, doch der Schwerpunkt der Wartung ist zu uv gewandert
Der aktuelle Status von Rye
-
Eingestellte Entwicklung und Empfehlung für uv
- Allen Nutzern wird die Verwendung von uv empfohlen
- uv ist ein von denselben Maintainern entwickeltes Nachfolgeprojekt
- uv wird aktiv gepflegt und ist deutlich weiter verbreitet als Rye
- Bestehende Rye-Nutzer können den uv migration guide konsultieren
- Rye kann weiterhin verwendet werden, aber es sind keine weiteren Updates geplant
- Auch Sicherheitsupdates sind nicht geplant
Welche Funktionen Rye bereitstellte
- Rye ist eine Projekt- und Paketverwaltungslösung für Python
- Es wurde mit dem Ziel entwickelt, ein One-Stop-Tool für Python-Nutzer zu sein
- Innerhalb einer integrierten Nutzungserfahrung deckt es folgende Aufgaben ab
- Verwaltung von Python-Installationen
- Projektverwaltung auf Basis von
pyproject.toml - Abhängigkeitsverwaltung
- Verwaltung virtueller Umgebungen
- Installation globaler Tools
- Es wurde dafür konzipiert, komplexe Projekte und Monorepos zu handhaben
- Ein Einführungsvideo ist unter Watch an introduction verfügbar
2 Kommentare
Es ist schon eine Weile her, aber nachdem ich dies und das ausprobiert habe, verwende ich
Introduction - PDM
.
Dann sollte ich wohl auch Rye einmal ausprobieren.
Hacker-News-Kommentare
Ein großer Teil der zentralen Packaging-Entwicklung findet inzwischen bei uv statt, und Rye nutzt uv intern. Wenn uv besser wird, wird Rye also mit besser.
Zum Beispiel wurde uv kürzlich um universelle Dependency Resolution erweitert, sodass man eine gesperrte
requirements.txtmit einem einzigen Resolution-Ergebnis erstellen kann, das nicht nur auf dem aktuell laufenden System, sondern auf allen Plattformen und Betriebssystemen funktioniert. Das aktuelle Rye unterstützt das ebenfalls.https://github.com/astral-sh/uv
Ich arbeite an Rye und uv; wenn es Fragen gibt, kann ich sie beantworten.
https://github.com/python-poetry/poetry/issues/6409
https://news.ycombinator.com/item?id=39257501
Das ist einer der Gründe, warum mein Team beim Umstieg zögert. Da wir ML-Arbeit machen, wäre bei einem PyTorch-basierten Projekt der gewünschte Zustand zum Beispiel, alle Dependencies in
pyproject.tomlzu haben und von einer AArch64-Mac- oder AMD64-Windows-Workstation aus Lockfiles für folgende Plattformkonfigurationen erzeugen zu können: Mac mit Standard-MPS-PyTorch, Windows mit CUDA-PyTorch, AArch64 Linux mit CPU-PyTorch, AMD64 Linux mit CPU-PyTorch, AMD64 Linux mit CUDA-PyTorch.Danke für Ruff; wir sind sowohl mit dem Linting als auch mit der Formatierung sehr zufrieden.
pyenv+venv+pipwar immer schmerzhaft. Inzwischen bin ich zu Rye gewechselt.Jetzt reicht: Rye installieren, von GitHub holen,
rye synceingeben, fertig.https://guac.sh/
https://pypi.org/project/sbom4python/ https://github.com/CycloneDX/cyclonedx-python
Dank der kürzlich hinzugefügten Funktion zum Aufheben fester Dependency-Pinnings kann man während der Entwicklung Kompatibilität fördern und für Reproduzierbarkeit eine genaue, explizite
requirements.txterzeugen. Dadurch werden Vulnerability Management und der SBOM-Schritt deutlich einfacher als mit Tools wie Poetry.Aus ähnlichen Gründen nutze ich https://hatch.pypa.io/latest/why/, und mir gefällt auch, dass es gut mit
uvzusammenspielt.Was mich an Rye abgeschreckt hat, ist, dass es stark zur Nutzung eines nicht standardmäßigen Python-Builds rät.
Auf der Philosophie-Seite (https://rye.astral.sh/philosophy/) wird erklärt, dass die CPython-Builds von python.org völlig unzureichend seien, je nach Plattform nur
.msi-Installer oder nur Tarballs bereitstünden und die verschiedenen Python-Distributionen stark auseinanderliefen, was im nachgelagerten Ökosystem allerlei Probleme verursache. Deshalb verwendet das Projekt die Standalone-Builds von indygreg und hofft, dass es irgendwann gut gepflegte und vertrauenswürdige Python-Builds gibt, die das heutige Durcheinander ersetzen.Informationen zu diesen indygreg-Builds gibt es unter https://gregoryszorc.com/docs/python-build-standalone/main/, und man kann auch ein anderes Python auswählen: https://rye.astral.sh/guide/toolchains/
Allerdings bin ich den dort beschriebenen Problemen kaum je begegnet. Offizielle Python-Builds von python.org haben funktioniert, normales über den Paketmanager der Distribution installiertes Python hat funktioniert, und Python in offiziellen Docker-Container-Images hat ebenfalls funktioniert.
Diese speziellen Builds mögen gut funktionieren, aber wegen der Nicht-Standardmäßigkeit zögere ich. Es gibt sogar eine Liste von Laufzeit-Besonderheiten; ich verstehe nicht, warum man Besonderheiten hinzufügen sollte, wo es kein Problem gibt. Dass die Rye-Philosophie so offensiv für diese Builds eintritt, macht es für mich weniger attraktiv als Alternativen, die standardmäßig das bereits im Betriebssystem vorhandene Python verwenden.
Python aus dem Quellcode zu bauen braucht neue System-Dependencies und dauert lange, und am Ende erhält man noch unverständlichere Fehler wegen fehlender Header-Dateien. Sucht man nach diesem Fehler, findet man ein
./configure-Flag, das ein Problem umgeht, das Upstream-GCC 2017 behoben hat, und irgendwie klappt es dann doch.Wenn man solche dreifachen Fehler oder manylinux-Build-Umgebungen nie erlebt hat, hat man eine ganze Welt des Schmerzes vermieden. Dasselbe gilt für Windows-Installationsskripting oder Punkte wie „Einschränkung der verfügbaren CPU-Instruktionen“ auf jener Seite.
Python-Quellcode wird regelmäßig heruntergeladen, mit standardmäßigen Produktionsoptimierungen kompiliert und anschließend unter
/use/local/python${version}installiert; seit Python 3.7 im Jahr 2018 erschienen ist, funktioniert das äußerst konsistent.Nach meiner Erfahrung sind diese Befehle so stabil und konsistent, dass man sie problemlos automatisieren könnte. Ich frage mich, wo der Autor genau das Problem sieht oder was der grundlegende Einwand ist.
Für Python 3.10.14 etwa kann man keine Installationsdatei herunterladen; der letzte Windows-Installer ist Python 3.10.11 vom 5. April 2023.
Ich mag Rye. Es tut genau das, was es verspricht, macht den gesamten Ablauf rund um
venv, Python-Versionen und Packaging tatsächlich angenehm und wirkt für Leute, die mit offiziellen Python-Nutzungsweisen wiepyproject.tomlvertraut sind, nahezu transparent.Außerdem lässt es Python wie Cargo wirken, und Cargo ist ebenfalls ein sehr angenehmes Tool.
Persönlich halte ich pip-tools für deutlich besser designt als Poetry oder Pipenv. Es war sowohl zu pip als auch zu
virtualenvorthogonal, und beides sind ohnehin seit Langem etablierte Workflows in Python. Rye kann man als Beispiel dafür sehen, dass ein iterativ verbesserter, standardkonformer Ansatz gewinnt.Neben dem Geschwindigkeitsschub durch Rust gefällt mir, dass es sinnvolle Defaults dafür gibt, wo virtuelle Umgebungen liegen sollen (
.venv) und wie mehrere Python-Versionen installiert werden. Das wirkt klein, aber nachdem Wheels die numpy-Installationsprobleme gelöst hatten, waren solche vernünftigen Defaults und eingebaute pip-tools im Grunde alles, was noch fehlte. In diesem Sinne frage ich mich auch, welche Existenzberechtigung Anaconda nach dem Aufkommen binärer Wheels noch hatte.Schön zu hören, dass es inzwischen besser wird.
Es scheint mehr Python-Paketmanager zu geben als Google-Chat-Apps.
Und was Kuratierung angeht, wirkt der Vorschlag, einer kleinen Organisation mehr zu vertrauen als einer größeren und älteren, schwer überzeugend. Anders gesagt: Ich frage mich, was genau versprochen wird. Was ich herauslesen kann, ist ungefähr „ein guter Paketmanager ist gut und schnell und gut“; eine Vergleichs- oder Philosophie-Seite wäre hilfreich.
Der Zynismus auf HN überrascht mich manchmal.
Ich mag Rye. Nachdem ich Paketmanager anderer Sprachen wie Cargo oder Hex benutzt hatte, fand ich es immer schade, dass Python kein ähnliches System hat; Rye hat diesen Bedarf für mich vollständig gedeckt. Wenn man nicht mehrere Tools installieren möchte, um
venv, Python-Versionen und Projektabhängigkeiten zu verwalten, ist es wirklich schön, dass Rye alles in einem erledigt.Bei Rye habe ich noch kein Gefühl dafür, aber conda kann
venv, Python-Versionen und Projektabhängigkeiten ebenfalls gut verwalten.Einen neuen Python-Dependency-Manager zu entdecken fühlt sich an, als würde man zufällig auf ein neues JavaScript-Framework stoßen.
venv.Wenn man Ports anfassen muss, ein Programm ausliefern soll oder eine Bibliothek von C oder Betriebssystemkomponenten abhängt, ist es besser, Beratungsarbeit anzunehmen, bei der man nach der Bezahlung weder die Codebasis pflegen noch Verantwortung übernehmen muss.
Heutzutage kann man in Docker auch CUDA und PyTorch ausführen. Wenn in solchen Threads jemand sagt: „Nimm einfach Docker“, lautet die übliche Antwort oft: „Ich will Docker nicht lernen“; dabei braucht man selbst ohne jede Docker-Erfahrung vielleicht 10 Minuten, um einen Python-Container zu starten.
pixi(https://pixi.sh/latest/) ist gut. Man kann die Python-Version pinnen und Pakete aus conda und PyPI installieren; es ist in Rust geschrieben.
curlholen und in bash pipen soll und anschließendevalauf die Ausgabe eines beliebigen Befehls ausführen soll, schreckt mich ab.Der Hintergrund ist etwas komplex. Es gab conda von der Firma Anaconda, geschrieben in Python, und das Open-Source-Ökosystem conda-forge ist ein conda-Channel mit CI-Build-Bots. Später entstand unter demselben conda-forge-Dach mamba, in C++ geschrieben, als Ersatz für conda; es ist ein echter Drop-in-Ersatz in dem Sinne, dass
alias conda=mambafunktionieren sollte. Inzwischen verwendet auch conda libmamba als Solver, um schneller zu werden.Danach hat der Autor von mamba das Ganze als pixi ausgegliedert und in Rust neu geschrieben, mit einer anderen Philosophie für den Ort von Environments und ihre Aktivierung, aber es bleibt vollständig kompatibel mit conda-Environments.
conda hat die Installation von PyPI-Paketen über
pipimmer unterstützt, etwa wenn sie nicht in den conda-Channels vorhanden waren; pixi unterstützt PyPI-Pakete über uv. Deshalb ist pixi schnell. Laut Blogbeitrag gibt es auch andere Optimierungen, die es deutlich schneller als mamba machenWenn man Pakete verwendet, die nicht reines Python sind, ist die conda-Familie die richtige Wahl. Die Wahl des Paketmanagers (conda/mamba/pixi) ist zweitrangig
Das Problem bei PyPI ist, dass es zu wenig Gatekeeping gibt. Dazu kommt, dass eine standardisierte Methode fehlt, Pakete, die nicht reines Python sind, zu paketieren. Dadurch können Umgebungen leaken oder, insbesondere wenn nur Source verteilt wird und dann in
setup.pyseltsame Dinge passieren, bis hin zum Bootstrapping der Umgebung inklusive Compiler, wird es nicht reproduzierbarAuf conda-Seite betreibt der conda-forge-Channel eine ziemlich gute Qualitätskontrolle. Es werden Constraints, Lizenzen, fehlende Lizenzdateien in PyPI-Distributionen, Umgebungsisolation usw. geprüft. Perfekt ist es natürlich nicht, weil Maintainer einen offiziellen Bot verwenden können, der PyPI-Änderungen mit falschen Versions-Constraints automatisch merged
Das Problem, das derzeit kein Tool löst, ist PyPI-zentriert. Man muss mit Paketen umgehen, die es nicht in conda gibt, und Paket-Releases müssen faktisch zuerst auf PyPI veröffentlicht werden
Selbst wenn man Pakete, die nur auf PyPI existieren, über conda installiert, können einige ihrer Abhängigkeiten in conda vorhanden sein. Meines Wissens nutzt kein Paketmanager conda-Pakete, um Abhängigkeiten von PyPI-Paketen zu erfüllen. Man kann zwar manuell conda-Pakete hinzufügen, um die Abhängigkeiten passend zu machen, riskiert aber, dass die korrekten Versions-Constraints nicht angewendet werden
Auch wenn man Open-Source-Python-Pakete schreibt, muss oder sollte man meist zuerst auf PyPI releasen, selbst wenn die Konfiguration nur von conda-Channels abhängt. Denn Releases im conda-forge-Channel setzen faktisch voraus, dass das Paket auf PyPI existiert. Deshalb kann Rye auch für Leute wie mich weiterhin nützlich sein und ist einen Blick wert
Ich finde dieses Projekt sehr vielversprechend, werde aber warten, bis es einen reiferen Stand erreicht hat. Da ich alles andere vom Astral-Team mag, sind meine Erwartungen hoch
Jedes Mal, wenn ich ein Python-Projekt starte, fühlt es sich so an, als müsste ich den aktuellen Stand von Abhängigkeits- und Virtual-Environment-Management neu lernen