Skip to content

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

Aktualisiert am

Python 3.15 mit einem uv-Befehl installieren und prüfen, ob numpy, pandas, PyTorch, DuckDB und Polars schon laufen. Auf macOS getestet: Kompatibilitätstabelle, Lazy Imports, die den Start eines Skripts von 2.7 s auf 0.01 s verkürzen, die drei SyntaxError-Fälle und der Free-threaded-Build.

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.15

Legen 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 matplotlib

Der 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:

ÄnderungWas das für Sie bedeutetAktion
Lazy Imports (PEP 810)lazy import x lädt das Modul erst bei der ersten NutzungIn 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-8Windows-Nutzer mit cp1252- / cp932- / GBK-Dateien: encoding= explizit angeben
uv 0.13 nimmt standardmäßig 3.15Neue uv-Projekte ohne Pin bekommen automatisch 3.153.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-WheelsAuf 3.15t mit Source-Builds rechnen
frozendict, sentinel als Built-ins, Paket profilingNeue eingebaute Typen und der Sampling-Profiler TachyonOptional; 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.

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.15

uv 0.13.0 hat den normalen und den Free-threaded-Build in 24.8 Sekunden installiert:

uv python install 3.15 3.15t
Installed 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.14

Das 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, dann pyenv install 3.15.0. Warten Sie, bis Ihre pyenv-Version 3.15.0 auflistet.
  • conda: eine Umgebung mit python=3.15 anlegen, 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.15Python 3.15t (free-threaded)Hinweise
numpy 2.5.4WheelWheel
pandas 3.0.6WheelWheel
scipy 1.18.1WheelWheel
scikit-learn 1.9.1WheelWheel
matplotlib 3.11.2WheelWheel
pyarrow 26.0.0WheelWheel
polars 2.0.0Wheel (abi3)Build aus dem QuellcodeDie 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)WheelNicht getestetJupyter-Kernel laufen auf 3.15
duckdb 1.5.6Build aus dem QuellcodeNicht getestetWheels enden bei cp314. Der C++-Build dauerte etwa 2.5 min
pygwalker 0.5.0.1FunktioniertNicht getestetZieht duckdb nach und erbt damit den Source-Build
torch 2.14.1Nicht installierbarNicht installierbarWheels gibt es nur für cp310 bis cp314 und cp314t
tensorflow 2.21.0Nicht installierbarNicht installierbarWheels 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.txt

Lö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:

VarianteZeitZeilen in -X importtime
Eager Imports2.69 bis 2.74 s1,747
lazy import0.01 s27

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'> True

Um ü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:

WoFehlermeldung
In einer FunktionSyntaxError: lazy import not allowed inside functions
In try / exceptSyntaxError: lazy import not allowed inside try/except blocks
Stern-ImportSyntaxError: 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 ModuleNotFoundError

Fü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 --help

Unser 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 done

Bibliotheken, 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 wird

Wir 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:

BuildSequenziell4 ThreadsSpeedup
Python 3.150.72 s0.71 s1.0×
Python 3.15t0.65 s0.19 s3.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 SituationEmpfehlung
Skripte, CLIs, Automatisierung mit dem numpy- / pandas- / sklearn-StackUpgraden. Lazy Imports bringen echten Gewinn
Jupyter-Notebooks für AnalysenIn einer neuen Umgebung upgraden; den alten Kernel ein paar Wochen behalten
Projekte mit PyTorch oder TensorFlowBei 3.14 bleiben (uv python pin 3.14)
DuckDB oder Polars auf 3.15t in der CIAuf Wheels warten oder Kompilierzeit und einen Compiler in der CI in Kauf nehmen
Windows-Code, der Dateien in alten Kodierungen liestErst 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

SymptomUrsacheLösung
uv python install 3.15 installiert 3.15.0a4uv ist älter als 0.13uv 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-runtimeSource-Build, weil kein passendes Wheel existiertAbwarten (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 KlasseImport 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 UpgradeUTF-8 ist jetzt die Standardkodierungencoding="cp1252" / "cp932" / "gbk" oder encoding="locale" angeben
Neues uv-Projekt landet unerwartet auf 3.15uv 0.13 hat den Standard geändertuv python pin 3.14
SyntaxWarning: 'return' in a 'finally' block aus einer AbhängigkeitDie Bibliothek enthält alten Code, den neuere Python-Versionen markierenHarmlos; 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