Python 3.15 installieren und upgraden: uv, Lazy Imports und Paket-Kompatibilität getestet
Aktualisiert am

Die kurze Antwort: Python 3.15.0 ist am 9. Oktober 2026 erschienen. Wenn Sie uv (opens in a new tab) nutzen, aktualisieren Sie zuerst uv und installieren dann:
uv self update
uv python install 3.15Legen Sie danach ein Testprojekt an und probieren Sie Ihre echten Abhängigkeiten aus, bevor Sie etwas Wichtiges umstellen:
uv init --python 3.15 py315-test
cd py315-test
uv add numpy pandas scikit-learn matplotlibDer wissenschaftliche Kern-Stack installiert sich heute schon aus fertigen Wheels. PyTorch und TensorFlow nicht. DuckDB wird aus dem Quellcode kompiliert. Wenn Ihr Projekt davon abhängt, bleiben Sie vorerst bei 3.14 (uv python pin 3.14).
Der Grund für das Upgrade sind Lazy Imports. Ein einziges Schlüsselwort, lazy import pandas as pd, hat den --help-Pfad eines Testskripts von 2.7 Sekunden auf 0.01 Sekunden gebracht.
Was getestet wurde: Alles, was unten als „getestet“ markiert ist, lief am 11. Oktober 2026 auf einem Apple M4 Max (macOS) mit uv 0.13.0 und CPython 3.15.0 / 3.15.0t aus
uv python install. Das Verhalten unter Windows und Linux, der Installer von python.org, pyenv und conda stammen aus der offiziellen Dokumentation und wurden nicht getestet.
Was sich in 3.15 spürbar ändert
Das Changelog ist lang. Wenn Sie Datenskripte oder CLIs schreiben, begegnen Ihnen vor allem diese fünf Änderungen:
| Änderung | Was das für Sie bedeutet | Aktion |
|---|---|---|
| Lazy Imports (PEP 810) | lazy import x lädt das Modul erst bei der ersten Nutzung | In CLIs, Skripten und langsam startenden Apps einsetzen |
| UTF-8 ist die Standardkodierung (PEP 686) | open("file.txt") liest und schreibt jetzt auf jedem Betriebssystem UTF-8 | Windows-Nutzer mit cp1252- / cp932- / GBK-Dateien: encoding= explizit angeben |
| uv 0.13 nimmt standardmäßig 3.15 | Neue uv-Projekte ohne Pin bekommen automatisch 3.15 | 3.14 pinnen, wo Ihre Abhängigkeiten noch nicht so weit sind |
| Free-threaded-Build bekommt eine stabile ABI (PEP 803) | python3.15t führt Threads parallel aus, aber die meisten Pakete liefern dafür noch keine Stable-ABI-Wheels | Auf 3.15t mit Source-Builds rechnen |
frozendict, sentinel als Built-ins, Paket profiling | Neue eingebaute Typen und der Sampling-Profiler Tachyon | Optional; nichts geht kaputt, wenn Sie sie ignorieren |
Die vollständige Liste finden Sie im offiziellen What's New in Python 3.15 (opens in a new tab). Der Rest dieser Anleitung behandelt die konkreten Aufgaben: installieren, Kompatibilität prüfen, Lazy Imports nutzen, die Kodierungsänderung abfangen und über Free-Threading entscheiden.
- Python 3.15 installieren und upgraden: uv, Lazy Imports und Paket-Kompatibilität getestet
- Claude Code Mods Tutorial: Eigenen Mod erstellen, testen und installieren, plus 15 Community-Beispiele
- GPT Image 2.5 nutzen: Flare vs. Sunburst, Anleitung und API-Preise
- DeepSeek Harness nutzen: Installation, Einrichtung und der erste Agent-Lauf
- Runcell Science: Open-Source-Alternative zu Claude Science für Forschungsteams
- Mac Ruhezustand verhindern: Codex, Claude Code und KI-Agenten weiterlaufen lassen
- OpenClaw vs ZeroClaw vs Pi Agent vs Nanobot: Welchen KI-Agenten-Stack sollten Sie 2026 wählen?
- Wie Claude Code Jupyter Notebooks analysiert: Data Science, Grenzen und die bessere Alternative
- Claude Code Routines: KI-Cronjobs für Agenten
- Claude Code Desktop: Bypass permissions aktivieren
- Schritt-für-Schritt-Anleitung zur Erstellung von zwei Python-Agenten mit Googles A2A-Protokoll
- Die Top 10 wachsenden Data Visualization Libraries in Python im Jahr 2025
Schritt 1: Python 3.15 installieren
Mit uv (getestet)
Aktualisieren Sie uv vor der Installation. Diesen Schritt zu überspringen ist diese Woche der häufigste Fehler. Ein älteres uv kennt nur die Alpha-Builds. Auf unserem bereits installierten uv 0.9.25 zeigte uv python list 3.15 nur cpython-3.15.0a4. Ein uv python install 3.15 hätte dort eine Alpha installiert, nicht das Release.
uv self update # braucht 0.13.0 oder neuer
uv --version
uv python install 3.15uv 0.13.0 hat den normalen und den Free-threaded-Build in 24.8 Sekunden installiert:
uv python install 3.15 3.15tInstalled 2 versions in 24.83s
+ cpython-3.15.0+freethreaded-macos-aarch64-none (python3.15t)
+ cpython-3.15.0-macos-aarch64-none (python3.15)Haben Sie uv über Homebrew, pip oder pipx installiert, funktioniert uv self update nicht. Aktualisieren Sie es dann auf demselben Weg (brew upgrade uv, pipx upgrade uv).
uv 0.13 ändert außerdem den Standard. Laut den Release Notes zu uv 0.13.0 (opens in a new tab) lädt uv python install ohne Versionsangabe jetzt 3.15 herunter. Ein neues uv venv oder uvx python lädt 3.15, wenn noch kein passendes Python installiert ist. Vorhandene Installationen werden weiter genutzt. Um ein Projekt auf 3.14 zu halten, legen Sie das fest:
uv python pin 3.14Das schreibt eine .python-version, die uv bei jedem Aufruf in diesem Ordner liest.
Andere Wege (aus der offiziellen Doku, hier nicht getestet)
- Installer von python.org (Windows, macOS): 3.15.0 von python.org/downloads (opens in a new tab) herunterladen. Laut Release Notes installiert der offizielle macOS-Installer die Free-Threading-Unterstützung jetzt standardmäßig mit, und die 64-Bit-Binaries für Windows nutzen den neuen Tail-Calling-Interpreter.
- pyenv:
pyenv update, dannpyenv install 3.15.0. Warten Sie, bis Ihre pyenv-Version 3.15.0 auflistet. - conda: eine Umgebung mit
python=3.15anlegen, sobald conda-forge die Version veröffentlicht hat. Prüfen Sie das, bevor Sie eine Migration darauf aufbauen.
Einen allgemeinen Überblick, wie Sie die Python-Version auf jedem Betriebssystem wechseln, geben unsere ältere Anleitung zum Aktualisieren von Python und der Vergleich der Python-Versionsmanager. Diese Seite behandelt nur das, was speziell für 3.15 gilt.
Schritt 2: Prüfen, ob Ihre Pakete sich installieren lassen
Dieser Schritt entscheidet, ob Sie heute upgraden können. Wir haben ein sauberes 3.15-Projekt angelegt, einen typischen Data-Science-Stack installiert und danach auf PyPI die Pakete geprüft, nach denen am häufigsten gefragt wird.
Kompatibilitätstabelle (getestet am 11. Oktober 2026)
| Paket (Version) | Python 3.15 | Python 3.15t (free-threaded) | Hinweise |
|---|---|---|---|
| numpy 2.5.4 | Wheel | Wheel | |
| pandas 3.0.6 | Wheel | Wheel | |
| scipy 1.18.1 | Wheel | Wheel | |
| scikit-learn 1.9.1 | Wheel | Wheel | |
| matplotlib 3.11.2 | Wheel | Wheel | |
| pyarrow 26.0.0 | Wheel | Wheel | |
| polars 2.0.0 | Wheel (abi3) | Build aus dem Quellcode | Die Runtime liefert nur cp310-abi3-Wheels, die Free-threaded-Python nicht nutzen kann. Der Rust-Build dauerte 6 min 51 s |
| ipykernel 9.17.1 (pyzmq, psutil, debugpy) | Wheel | Nicht getestet | Jupyter-Kernel laufen auf 3.15 |
| duckdb 1.5.6 | Build aus dem Quellcode | Nicht getestet | Wheels enden bei cp314. Der C++-Build dauerte etwa 2.5 min |
| pygwalker 0.5.0.1 | Funktioniert | Nicht getestet | Zieht duckdb nach und erbt damit den Source-Build |
| torch 2.14.1 | Nicht installierbar | Nicht installierbar | Wheels gibt es nur für cp310 bis cp314 und cp314t |
| tensorflow 2.21.0 | Nicht installierbar | Nicht installierbar | Wheels gibt es nur für cp310 bis cp313 |
numpy, pandas, scipy, scikit-learn, matplotlib, pyarrow und polars zu installieren dauerte auf 3.15 inklusive Download 71 Sekunden, ohne Kompilieren. Dieselbe Auswahl brauchte auf 3.15t 6 Minuten 51 Sekunden, fast ausschließlich für das Kompilieren von Polars.
Fehlt einem Paket ein Wheel, sagt uv genau, warum. So sieht das bei PyTorch auf 3.15 aus:
hint: You require CPython 3.15 (`cp315`), but we only found wheels for `torch`
(v2.14.1) with the following Python ABI tags: `cp310`, `cp311`, `cp312`, `cp313`, `cp314`, `cp314t`Das eigene Projekt in einer Minute prüfen
Dafür müssen Sie nichts installieren. Führen Sie einen Dry Run gegen eine 3.15-Umgebung aus:
uv venv --python 3.15 .venv315
uv pip install --dry-run --python .venv315/bin/python -r requirements.txtLöst sich alles auf, passt es. Sehen Sie den cp315-Hinweis von oben, ist dieses Paket Ihr Blocker.
Ein Source-Build ist kein Fehler, aber er ist langsam und braucht einen Compiler (Rust für Polars, C++ für DuckDB). In der CI kann ein Source-Build aus einem Ein-Minuten-Job einen Zehn-Minuten-Job machen. Pinnen Sie in der CI 3.14, bis die Wheels da sind.
Schritt 3: Mit Lazy Imports Skripte schneller starten
Lazy Imports sind aus meiner Sicht der beste Grund für den Umstieg auf 3.15. Das Problem, das sie lösen, kennen Sie wahrscheinlich.
Ein Kommandozeilen-Skript importiert meist alles ganz oben. Selbst my_tool.py --help zahlt den vollen Preis für das Laden von pandas, matplotlib und scikit-learn, obwohl es keines davon nutzt.
Vorher und nachher (getestet)
Die Variante mit sofortigen (eager) Imports:
import sys
import pandas as pd
import matplotlib.pyplot as plt
import sklearn.linear_model
if len(sys.argv) > 1 and sys.argv[1] == "--help":
print("usage: tool [--help] file.csv")
sys.exit(0)Die Lazy-Variante ergänzt nur das Schlüsselwort lazy:
import sys
lazy import pandas as pd
lazy import matplotlib.pyplot as plt
lazy from sklearn import linear_model
if len(sys.argv) > 1 and sys.argv[1] == "--help":
print("usage: tool [--help] file.csv")
sys.exit(0)
df = pd.DataFrame({"x": [1, 2, 3], "y": [2, 4, 6]})
model = linear_model.LinearRegression().fit(df[["x"]], df["y"])
print(model.coef_)Ergebnisse auf unserem Rechner, je fünf Durchläufe von python script.py --help:
| Variante | Zeit | Zeilen in -X importtime |
|---|---|---|
| Eager Imports | 2.69 bis 2.74 s | 1,747 |
lazy import | 0.01 s | 27 |
Der vollständige Codepfad funktioniert weiterhin: Die Lazy-Variante hat die Regression angepasst und 2.0 ausgegeben. pandas wird in der Zeile geladen, die pd zum ersten Mal nutzt.
Ihre absoluten Zahlen werden abweichen. In dieser Umgebung dauerte import sklearn.linear_model allein 2.2 s und import pandas 0.86 s. Das Muster gilt für jeden Zweig Ihres Programms, der keine schwere Bibliothek anfasst.
Sehen, was Lazy Imports tun
Ein Lazy-Name ist ein Proxy, bis Sie ihn nutzen. Das lässt sich sichtbar machen:
import sys
lazy import json
print(type(globals()["json"])) # <class 'lazy_import'>
print("json" in sys.modules) # False
json.dumps(1)
print(type(globals()["json"]), "json" in sys.modules) # <class 'module'> TrueUm überhaupt herauszufinden, welche Imports langsam sind, führen Sie python -X importtime your_script.py 2> imports.log aus und sortieren nach der zweiten Spalte.
Drei Stellen, an denen lazy ein SyntaxError ist (getestet)
lazy funktioniert nur auf Modulebene. Wir sind auf alle drei Fehler gestoßen:
| Wo | Fehlermeldung |
|---|---|
| In einer Funktion | SyntaxError: lazy import not allowed inside functions |
In try / except | SyntaxError: lazy import not allowed inside try/except blocks |
| Stern-Import | SyntaxError: lazy from ... import * is not allowed |
Die try/except-Regel ist die wichtigste. Code wie try: import ujson as json except ImportError: import json kann nicht lazy werden. Lassen Sie den Fallback eager oder verschieben Sie ihn in ein kleines Modul, das Sie lazy importieren.
Laut offizieller Doku können auch Klassenkörper und from __future__-Imports nicht lazy sein.
Fehler wandern zur ersten Nutzung
Ein fehlendes Modul schlägt nicht mehr ganz oben in der Datei fehl:
lazy import not_a_real_module
print("defined ok") # das wird ausgegeben
not_a_real_module.x # erst hier kommt ModuleNotFoundErrorFür optionale Abhängigkeiten ist das praktisch. Es heißt aber auch, dass ein Tippfehler in einem Import unbemerkt bleiben kann, bis ein selten genutzter Codepfad läuft. Behalten Sie mindestens einen Test, der jeden Lazy Import auslöst.
Alles lazy machen, ohne den Code anzufassen
Sie können das ganze Programm über die Kommandozeile auf Lazy Imports umstellen:
python -X lazy_imports=all my_tool.py --help
# oder
PYTHON_LAZY_IMPORTS=all python my_tool.py --helpUnser unverändertes Eager-Skript fiel so auf 0.01 s. Vorsicht aber bei Modulen, die beim Import etwas tun. Wir haben ein kleines Plugin-Modul gebaut, das beim Import etwas ausgibt und sich registriert. Mit lazy_imports=all lief die Registrierung nie, weil das Programm den Namen des Moduls nie angefasst hat:
normal: plugin registered / main done
all: main doneBibliotheken, die beim Import Plugins, Codecs oder matplotlib-Backends registrieren, können auf dieselbe Weise brechen. Nutzen Sie =all, um den möglichen Gewinn zu messen, und setzen Sie lazy dann von Hand bei den Imports, die Sie als sicher kennen. Für feinere Kontrolle beschreibt die Doku sys.set_lazy_imports_filter().
3.14 und 3.15 in derselben Datei unterstützen
Das Schlüsselwort lazy ist auf 3.14 und älter ein Syntaxfehler. Muss Ihr Code auf beiden laufen, nutzen Sie stattdessen die Liste __lazy_modules__ auf Modulebene. Ältere Versionen ignorieren sie, 3.15 behandelt diese Imports als lazy:
__lazy_modules__ = ["pandas"]
import sys
import pandas as pd # lazy auf 3.15, eager auf 3.14
print("pandas" in sys.modules) # auf 3.15 False, bis pd genutzt wirdWir haben bestätigt, dass pandas mit diesem Muster auf 3.15 nicht in sys.modules landete.
Schritt 4: Mit dem UTF-8-Standard umgehen
Auf 3.15 nutzt open() ohne encoding-Argument auf jeder Plattform UTF-8. Wir haben bestätigt, dass sys.flags.utf8_mode == 1 standardmäßig gilt und mit PYTHONUTF8=0 auf 0 steht.
Auf macOS und Linux ändert das fast nichts. Unter Windows ändert es das Verhalten jedes Codes, der ältere Dateien ohne Angabe einer Kodierung liest: Excel-CSV-Exporte in cp1252, japanische Shift-JIS-Dateien (cp932) oder chinesische GBK-Dateien. Solche Lesevorgänge können jetzt einen UnicodeDecodeError werfen oder verstümmelten Text liefern.
Die Lösung ist, die Kodierung explizit anzugeben:
import pandas as pd
df = pd.read_csv("export.csv", encoding="cp932") # japanischer Excel-Export
with open("legacy.txt", encoding="locale") as f: # altes Verhalten: System-Locale
text = f.read()Um betroffenen Code vor dem Upgrade zu finden, lassen Sie Ihre Tests auf Ihrem aktuellen Python mit -X warn_default_encoding laufen. Um vorübergehend das alte Verhalten zurückzubekommen, setzen Sie PYTHONUTF8=0.
Schritt 5: Über den Free-threaded-Build (3.15t) entscheiden
Free-threaded-Python entfernt den GIL, sodass reine Python-Threads mehrere CPU-Kerne nutzen können. Wir haben eine CPU-lastige Schleife viermal ausgeführt, erst nacheinander, dann auf vier Threads:
| Build | Sequenziell | 4 Threads | Speedup |
|---|---|---|---|
| Python 3.15 | 0.72 s | 0.71 s | 1.0× |
| Python 3.15t | 0.65 s | 0.19 s | 3.4× |
Der GIL blieb auch nach dem Import von numpy, pandas, scikit-learn, polars, matplotlib und pyarrow aus (sys._is_gil_enabled() lieferte False).
Nutzen Sie 3.15t, wenn Sie CPU-lastigen reinen Python-Code in Threads ausführen und Ihre Abhängigkeiten cp315t-Wheels haben. Lassen Sie es, wenn Sie auf Polars, DuckDB oder Deep-Learning-Bibliotheken angewiesen sind. Lassen Sie es ebenfalls, wenn Ihre schwere Arbeit ohnehin in NumPy oder pandas läuft, die den GIL selbst freigeben.
Sollten Sie jetzt upgraden?
| Ihre Situation | Empfehlung |
|---|---|
| Skripte, CLIs, Automatisierung mit dem numpy- / pandas- / sklearn-Stack | Upgraden. Lazy Imports bringen echten Gewinn |
| Jupyter-Notebooks für Analysen | In einer neuen Umgebung upgraden; den alten Kernel ein paar Wochen behalten |
| Projekte mit PyTorch oder TensorFlow | Bei 3.14 bleiben (uv python pin 3.14) |
| DuckDB oder Polars auf 3.15t in der CI | Auf Wheels warten oder Kompilierzeit und einen Compiler in der CI in Kauf nehmen |
| Windows-Code, der Dateien in alten Kodierungen liest | Erst explizites encoding= ergänzen, dann upgraden |
Python 3.15 in Jupyter nutzen
ipykernel lässt sich auf 3.15 installieren und funktioniert. So registrieren Sie einen 3.15-Kernel aus einem uv-Projekt:
uv add ipykernel
uv run python -m ipykernel install --user --name py315 --display-name "Python 3.15"Wenn Sie in Notebooks arbeiten: RunCell (opens in a new tab) läuft als KI-Agent direkt in Jupyter und sieht daher den aktuellen Zustand Ihres Kernels. Das hilft, wenn Sie testen, ob ein bestehendes Notebook auf dem neuen Kernel noch läuft. Auch PyGWalker (opens in a new tab) funktioniert auf 3.15 (getestet: pyg.to_html() hat einen DataFrame gerendert), mit dem oben erwähnten DuckDB-Kompiliervorgang.
Fehlerbehebung
| Symptom | Ursache | Lösung |
|---|---|---|
uv python install 3.15 installiert 3.15.0a4 | uv ist älter als 0.13 | uv self update oder über Homebrew / pipx aktualisieren |
No solution found … no wheels with a matching Python ABI tag (cp315) | Das Paket hat noch kein 3.15-Wheel (torch, tensorflow) | uv python pin 3.14 für dieses Projekt |
| Installation hängt minutenlang bei duckdb oder polars-runtime | Source-Build, weil kein passendes Wheel existiert | Abwarten (braucht einen C++- oder Rust-Compiler) oder 3.14 / normales 3.15 statt 3.15t nutzen |
SyntaxError: lazy import not allowed … | lazy in einer Funktion, in try oder in einer Klasse | Import auf Modulebene verschieben oder eager lassen |
| Ein Plugin oder Backend registriert sich nicht mehr | -X lazy_imports=all hat einen Import mit Seiteneffekten übersprungen | =all entfernen; lazy nur bei ausgewählten Imports nutzen |
UnicodeDecodeError unter Windows nach dem Upgrade | UTF-8 ist jetzt die Standardkodierung | encoding="cp1252" / "cp932" / "gbk" oder encoding="locale" angeben |
| Neues uv-Projekt landet unerwartet auf 3.15 | uv 0.13 hat den Standard geändert | uv python pin 3.14 |
SyntaxWarning: 'return' in a 'finally' block aus einer Abhängigkeit | Die Bibliothek enthält alten Code, den neuere Python-Versionen markieren | Harmlos; die Meldung kommt aus der Bibliothek, nicht aus Ihrem Code |
FAQ
Wann ist Python 3.15 erschienen? Python 3.15.0 ist am 9. Oktober 2026 erschienen.
Wie installiere ich Python 3.15 mit uv? Aktualisieren Sie uv auf 0.13.0 oder neuer und führen Sie dann uv python install 3.15 aus. Ältere uv-Versionen kennen nur die Alpha-Builds von 3.15.
Funktioniert pandas mit Python 3.15? Ja. pandas 3.0.6 liefert cp315- und cp315t-Wheels, ebenso numpy, scipy, scikit-learn, matplotlib und pyarrow.
Unterstützt PyTorch Python 3.15? Noch nicht. Stand 11. Oktober 2026 hat torch 2.14.1 Wheels nur bis cp314 und cp314t und lässt sich daher auf 3.15 nicht installieren.
Was sind Lazy Imports in Python 3.15? Mit lazy import module legt Python einen leichtgewichtigen Proxy an und lädt das Modul erst, wenn der Name zum ersten Mal genutzt wird. Das verkürzt die Startzeit für Codepfade, die das Modul nie anfassen.
Kann ich Lazy Imports nutzen und trotzdem Python 3.14 unterstützen? Ja. Definieren Sie __lazy_modules__ = ["module_name"] am Anfang des Moduls. Python 3.15 behandelt diese Imports als lazy, ältere Versionen ignorieren die Liste.
Wie halte ich ein Projekt auf Python 3.14? Führen Sie im Projektordner uv python pin 3.14 aus. Das schreibt eine .python-version-Datei, die uv beachtet.
Weiterführende Anleitungen
- Python auf Windows, Mac, Linux und in virtuellen Umgebungen aktualisieren
- Python-Versionsmanager im Vergleich
- So prüfen Sie Ihre Python-Version
- Python-Pakete aktualisieren
- Polars vs. pandas
- Python Circular Import: Fehler und Lösungen