Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 783 – Emscripten-Paketierung

Autor:
Hood Chatham <roberthoodchatham at gmail.com>
Sponsor:
Łukasz Langa <lukasz at python.org>
Discussions-To:
Discourse thread
Status:
Entwurf
Typ:
Standards Track
Thema:
Packaging
Erstellt:
28-Mrz-2025
Post-History:
02-Apr-2025, 18-Mrz-2025

Inhaltsverzeichnis

Zusammenfassung

Diese PEP schlägt eine neue Plattform-Tag-Serie pyodide für binäre Python-Paketverteilungen für die Pyodide Python-Laufzeitumgebung vor.

Emscripten ist eine vollständige Open-Source-Compiler-Toolchain. Es kompiliert C/C++-Code in WebAssembly/JavaScript-Ausführbare Dateien für die Verwendung in JavaScript-Laufzeitumgebungen, einschließlich Browsern und Node.js. Die Rust-Sprache unterhält ebenfalls ein Emscripten-Ziel. PEP 776 spezifiziert die Unterstützung von Python für Emscripten.

Motivation

Pyodide ist eine CPython-Distribution für die Verwendung im Browser. Ein Webbrowser ist eine universelle Computerplattform, die auf Windows, macOS, Linux und jedem Smartphone verfügbar ist. Hunderttausende von Schülern haben Python über Pyodide über Projekte wie Capytale und PyodideU kennengelernt. Pyodide wird auch zunehmend von Python-Paketen verwendet, um interaktive Dokumentationen bereitzustellen.

Pyodide unterhält derzeit Ports von 255 verschiedenen Paketen zum Zeitpunkt der Erstellung dieses Dokuments, darunter wichtige wissenschaftliche Python-Pakete wie NumPy, SciPy, pandas, Polars, scikit-learn, OpenCV, PyArrow und Pillow sowie Allzweckpakete wie aiohttp, Requests, Pydantic, cryptography und orjson.

Etwa 60 Pakete werden in ihrer CI auch gegen Pyodide getestet, darunter NumPy, pandas, awkward-cpp, scikit-image, statsmodels, PyArrow, Hypothesis und PyO3.

Python-Paketprojekte können keine binären Distributionen für Pyodide auf PyPI bereitstellen. Stattdessen müssen sie andere Optionen wie anaconda.org oder jsdelivr.com verwenden. Dies schafft Reibungspunkte sowohl für Paketbetreuer als auch für Benutzer.

Begründung

Emscripten verwendet eine Variante von musl libc. Der Emscripten-Compiler gibt zwischen den Versionen keine Garantien für die ABI-Stabilität. Viele Emscripten-Updates sind zufällig ABI-kompatibel, und das Rust-Emscripten-Ziel verhält sich so, als wäre die ABI stabil, mit nur gelegentlichen negativen Konsequenzen.

Es gibt mehrere Linker-Flags, die die Emscripten-ABI anpassen. Python-Pakete, die für die Ausführung mit Emscripten erstellt werden, müssen sicherstellen, dass die ABI-sensitiven Linker-Flags mit denen übereinstimmen, mit denen der Interpreter kompiliert wurde, um Ladezeit- oder Laufzeitfehler zu vermeiden. Der Emscripten-Compiler behebt kontinuierlich Fehler und fügt Unterstützung für neue Web-Plattform-Features hinzu. Daher gibt es erhebliche Vorteile, die ABI aktualisieren zu können.

Um die ABI-Stabilitätsanforderungen von Paketbetreuern mit der ABI-Flexibilität auszugleichen, die es der Plattform ermöglicht, voranzukommen, plant Pyodide die Einführung einer neuen ABI für jede Feature-Release von Python.

Das Pyodide-Team koordiniert auch die ABI-Flags, die Pyodide verwendet, mit der Emscripten-ABI, die Rust unterstützt, um sicherzustellen, dass wir Unterstützung für die vielen beliebten Rust-Pakete haben. Historisch gesehen bezog sich die meiste Arbeit hierfür auf Unwinding-ABIs. Siehe zum Beispiel dieser Rust Major Change Proposal.

Die Plattform-Tags pyodide gelten nur für Python-Interpreter, die mit derselben Emscripten-Version wie Pyodide kompiliert und verknüpft wurden, und mit denselben ABI-sensitiven Flags.

Spezifikation

Die Plattform-Tags werden die Form annehmen

pyodide_${YEAR}_${PATCH}_wasm32

Jeder dieser Tags wird mit einer bestimmten Python-Version verwendet. Zum Beispiel wird der Plattform-Tag pyodide_2025_0 mit Python 3.13 verwendet.

Emscripten Wheel ABI

Die Spezifikation der Plattform pyodide_<abi> umfasst

  • Welche Emscripten-Compiler-Version verwendet wird
  • Welche Bibliotheken mit dem Interpreter statisch verknüpft sind
  • Welche Stack-Unwinding-ABI verwendet werden soll
  • Wie der Lader die Abhängigkeitsauflösung handhabt
  • Dass Bibliotheken -pthread nicht verwenden dürfen
  • Dass Bibliotheken mit -sWASM_BIGINT verknüpft werden sollten

Die ABI wird durch Auswahl der entsprechenden Emscripten-Compiler-Version und Übergabe geeigneter Compiler- und Linker-Flags ausgewählt. Es ist möglich, dass andere Personen ihren eigenen Python-Interpreter erstellen, der mit der Pyodide-ABI kompatibel ist. Es ist nicht notwendig, die Pyodide-Distribution selbst zu verwenden.

Die Pyodide-ABIs sind vollständig in der Pyodide Platform ABI-Dokumentation spezifiziert.

Das pyodide build-Tool weiß, wie man Wheels erstellt, die mit der Pyodide-ABI übereinstimmen. Im Gegensatz zu manylinux-Wheels ist kein Docker-Container erforderlich, um die pyodide_<abi>-Wheels zu erstellen. Alles, was benötigt wird, ist eine Linux-Maschine und die entsprechenden Versionen von Python, Node.js und Emscripten.

Es ist möglich, ein Wheel zu validieren, indem es in die Pyodide-Laufzeitumgebung installiert und importiert wird. Da Pyodide in einer Umgebung mit starken Sandboxing-Garantien laufen kann, birgt dies keine Sicherheitsrisiken.

Ermittlung der ABI-Version

Die Pyodide-ABI-Version wird in der Konfigurationsvariable PYODIDE_ABI_VERSION gespeichert und kann über Folgendes ermittelt werden

pyodide_abi_version = sysconfig.get_config_var("PYODIDE_ABI_VERSION")

Um die Liste der kompatiblen Tags zu generieren, kann folgender Code verwendet werden

from packaging.tags import cpython_tags, _generic_platforms

def _emscripten_platforms() -> Iterator[str]:
    pyodide_abi_version = sysconfig.get_config_var("PYODIDE_ABI_VERSION")
    if pyodide_abi_version:
        yield f"pyodide_{pyodide_abi_version}_wasm32"
    yield from _generic_platforms()

emscripten_tags = cpython_tags(platforms=_emscripten_platforms())

Dieser Code wird zu pypa/packaging hinzugefügt.

Paketinstallationsprogramme

Installationsprogramme sollten die obige Funktion _emscripten_platforms() verwenden, um festzustellen, welche Plattformen mit einem Emscripten-Build von CPython kompatibel sind. Insbesondere wird die Pyodide-ABI-Version über sysconfig.get_config_var("PYODIDE_ABI_VERSION") bereitgestellt.

Paketindizes

Paketindizes SOLLTEN jedes Wheel akzeptieren, dessen Plattform-Tag dem regulären Ausdruck pyodide_[0-9]+_[0-9]+_wasm32 entspricht.

Abhängigkeitsspezifikations-Marker

Gemäß PEP 776 gibt unter Emscripten Python sys.platform "emscripten" zurück. Um nach der Emscripten-Plattform in einer Abhängigkeitsspezifikation zu suchen, kann sys_platform == "emscripten" (oder seine Negation) verwendet werden.

Trove-Klassifikator

Pakete, die Emscripten-Wheels erstellen und testen, können dies deklarieren, indem sie den Klassifikator Environment :: WebAssembly :: Emscripten hinzufügen. PyPI akzeptiert bereits Uploads von Paketen mit diesem Klassifikator.

Abwärtskompatibilität

Es gibt keine Abwärtskompatibilitätsprobleme in dieser PEP.

Sicherheitsimplikationen

Es gibt keine Sicherheitsimplikationen in dieser PEP.

Wie man das lehrt

Für Pyodide-Benutzer empfehlen wir die Pyodide-Dokumentation zur Installation von Paketen.

Für Paketbetreuer empfehlen wir die Pyodide-Dokumentation zum Erstellen und Testen von Paketen.

Referenzimplementierung

Zum Erstellen von Paketen: pyodide build und cibuildwheel.

Damit Installationsprogramme feststellen können, ob ein Wheel-Tag mit einem Emscripten-Interpreter von Pyodide kompatibel ist: pypa/packaging#804.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0783.rst

Zuletzt geändert: 2025-04-07 10:40:17 GMT