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

Python Enhancement Proposals

PEP 720 – Python-Pakete über Kreuz kompilieren

Autor:
Filipe Laíns <lains at python.org>
PEP-Delegate:

Status:
Entwurf
Typ:
Informational
Erstellt:
01. Juli 2023
Python-Version:
3.12

Inhaltsverzeichnis

Zusammenfassung

Dieses PEP versucht, den Status der Cross-Kompilierung von Downstream-Projekten zu dokumentieren.

Es sollte einen Überblick über die Ansätze geben, die derzeit von Distributoren (Linux-Distributionen, WASM-Umgebungsanbieter usw.) verwendet werden, um Downstream-Projekte (Drittanbieter-Erweiterungen usw.) über Kreuz zu kompilieren.

Motivation

Wir verfassen dieses PEP, um die Herausforderungen bei der Cross-Kompilierung darzustellen und als unterstützendes Dokument für zukünftige Verbesserungsvorschläge zu dienen.

Analyse

Einleitung

Es gibt einige verschiedene Ansätze, die zur Bewältigung dieses Problems eingesetzt werden, mit unterschiedlichem Aufwand für den Benutzer, aber alle erfordern einen erheblichen Aufwand. Dies liegt an der fehlenden standardisierten Cross-Kompilierungsinfrastruktur im Python-Paketierungsökosystem, das selbst aus der Komplexität von Cross-Builds resultiert und dies zu einer enormen Aufgabe macht.

Upstream-Unterstützung

Einige Hauptprojekte wie CPython, setuptools usw. bieten einige Unterstützung für die Cross-Kompilierung, aber dies ist inoffiziell und nach bestem Bemühen. Zum Beispiel ermöglicht das Modul sysconfig das Überschreiben des Datamodulnamens über die Umgebungsvariable _PYTHON_SYSCONFIGDATA_NAME, was für Cross-Builds erforderlich ist, und setuptools akzeptiert Patches [1], um seine Logik anzupassen/zu korrigieren, damit sie mit beliebten Workflows zum "Vortäuschen der Umgebung" kompatibel ist [2].

Das Fehlen von First-Party-Unterstützung in Upstream-Projekten führt dazu, dass die Cross-Kompilierung fragil ist und erheblichen Aufwand von den Benutzern erfordert. Gleichzeitig macht die mangelnde Standardisierung es für Upstreams schwieriger, die Unterstützung zu verbessern, da unklar ist, wie diese Funktion bereitgestellt werden soll.

Projekte mit brauchbarer Unterstützung für Cross-Builds

Es scheint relevant darauf hinzuweisen, dass es einige moderne Python-Paket-Build-Backends gibt, die zumindest eine brauchbare Unterstützung für die Cross-Kompilierung bieten: scikit-build und meson-python. Beide Projekte integrieren externe, ausgereifte Build-Systeme in die Python-Paketierung — CMake bzw. Meson —, so dass die Unterstützung für Cross-Builds von diesen übernommen wird.

Downstream-Ansätze

Die Ansätze zur Cross-Kompilierung liegen auf einem Spektrum, das von der Gestaltung her umfangreiche Benutzerinteraktion erfordert bis hin zu (idealerweise) fast keiner. Normalerweise basieren sie auf einer von zwei Hauptstrategien: die Verwendung einer Cross-Build-Umgebung oder das Vortäuschen der Zielumgebung.

Cross-Build-Umgebung

Dies besteht darin, den Python-Interpreter normal auszuführen und das von den Build-Systemen der Projekte bereitgestellte Cross-Build zu nutzen. Da die Upstream-Unterstützung jedoch, wie oben gesehen, fehlt, funktioniert dieser Ansatz nur für eine relativ kleine Anzahl von Projekten. Wenn dies fehlschlägt, besteht die übliche Strategie darin, den Build-System-Code zu patchen, um die richtige Toolchain, Systemdetails usw. zu verwenden. [3].

Da dieser Ansatz oft paketspezifisches Patching erfordert, ist er mit hohem Benutzeraufwand verbunden.

Beispiele

python-for-android, kivy-ios usw.

Vortäuschen der Zielumgebung

Um die Anforderung an die Benutzereingabe zu reduzieren, ist ein beliebter Ansatz der Versuch, die Zielumgebung vorzutäuschen. Dies besteht im Allgemeinen darin, den Python-Interpreter zu "monkeypatchen", um ihn dazu zu bringen, den Interpreter auf dem Zielsystem zu emulieren, was die Änderung vieler Attribute des `sys`-Moduls, der `sysconfig`-Daten usw. beinhaltet. Mit dieser Strategie müssen Build-Backends keine Cross-Build-Unterstützung haben und sollten ohne Codeänderungen funktionieren.

Leider ist es jedoch nicht möglich, die Zielumgebung wirklich vorzutäuschen. Dafür gibt es viele Gründe, einer der Hauptgründe ist, dass Code, der den laufenden Interpreter tatsächlich abfragen muss, dadurch kaputt geht. Daher ist das Monkeypatchen von Python, um es wie das Zielsystem aussehen zu lassen, sehr knifflig. Um den geringstmöglichen Schaden zu erzielen, können wir nur bestimmte Aspekte des Interpreters patchen. Folglich benötigen Build-Backends möglicherweise einige Codeänderungen, diese sind jedoch im Allgemeinen viel kleiner als beim vorherigen Ansatz. Dies ist eine inhärente Einschränkung der Technik, was bedeutet, dass diese Strategie immer noch etwas Benutzerinteraktion erfordert.

Dennoch funktioniert diese Strategie "out-of-the-box" mit signifikant mehr Projekten als der oben genannte Ansatz und erfordert in diesen Fällen viel weniger Aufwand. Sie ist erfolgreich darin, die benötigte Benutzerinteraktion zu reduzieren, auch wenn sie nicht generisch ist.

Beispiele

crossenv, conda-forge usw.

Umgebungsabfrage

Wie oben erläutert, ist der größte Teil des Build-Systemcodes so geschrieben, dass er davon ausgeht, dass das Zielsystem dasselbe ist wie das, auf dem der Build stattfindet. Daher wird die Umgebungsabfrage normalerweise verwendet, um den Build zu steuern.

In diesem Abschnitt versuchen wir, die meisten Methoden zu dokumentieren, mit denen dies erreicht wird. Es sollte einen guten Überblick über die Umgebungsdetails geben, die von Build-Systemen benötigt werden.

Ausschnitt Description Varianz
>>> importlib.machinery.EXTENSION_SUFFIXES
[
   '.cpython-311-x86_64-linux-gnu.so',
   '.abi3.so',
   '.so',
]
Erweiterungs-Suffixe (native Module), die von diesem Interpreter unterstützt werden. Dies ist implementierungsabhängig, aber es unterscheidet sich **normalerweise** je nach Implementierung, Systemarchitektur, Konfiguration des Builds, Python-Sprachversion und Implementierungsversion – falls vorhanden.
>>> importlib.machinery.SOURCE_SUFFIXES
['.py']
Quellcode-Suffixe (reines Python), die von diesem Interpreter unterstützt werden. Dies ist implementierungsabhängig, aber es unterscheidet sich **normalerweise** nicht (außer bei exotischen Implementierungen oder Systemen).
>>> importlib.machinery.all_suffixes()
[
   '.py',
   '.pyc',
   '.cpython-311-x86_64-linux-gnu.so',
   '.abi3.so',
   '.so',
]
Alle Moduldateisuffixe, die von diesem Interpreter unterstützt werden. Es *sollte* die Vereinigung aller `importlib.machinery.*_SUFFIXES`-Attribute sein. Dies ist implementierungsabhängig, aber es unterscheidet sich **normalerweise** je nach Implementierung, Systemarchitektur, Konfiguration des Builds, Python-Sprachversion und Implementierungsversion – falls vorhanden. Weitere Informationen finden Sie in den obigen Einträgen.
>>> sys.abiflags
''
ABI-Flags, wie in PEP 3149 angegeben. Unterscheidet sich je nach Build-Konfiguration.
>>> sys.api_version
1013
C-API-Version. Unterscheidet sich je nach Python-Installation.
>>> sys.base_prefix
/usr
Präfix der installationsweiten Verzeichnisse, in denen plattformunabhängige Dateien installiert werden. Unterscheidet sich je nach Plattform und Installation.
>>> sys.base_exec_prefix
/usr
Präfix der installationsweiten Verzeichnisse, in denen plattformabhängige Dateien installiert werden. Unterscheidet sich je nach Plattform und Installation.
>>> sys.byteorder
'little'
Natives Byte-Ordering. Unterscheidet sich je nach Plattform.
>>> sys.builtin_module_names
('_abc', '_ast', '_codecs', ...)
Namen aller Module, die in den Python-Interpreter kompiliert sind. Unterscheidet sich je nach Plattform, Systemarchitektur und Build-Konfiguration.
>>> sys.exec_prefix
/usr
Präfix der site-spezifischen Verzeichnisse, in denen plattformunabhängige Dateien installiert werden. Da es sich um die site-spezifischen Verzeichnisse handelt, ist es bei der Standardimplementierung von virtuellen Umgebungen ein Pfad, der für virtuelle Umgebungen spezifisch ist. Unterscheidet sich je nach Plattform, Installation und Umgebung.
>>> sys.executable
'/usr/bin/python'
Pfad des verwendeten Python-Interpreters. Unterscheidet sich je nach Installation.
>>> with open(sys.executable, 'rb') as f:
...   header = f.read(4)
...   if is_elf := (header == b'\x7fELF'):
...     elf_class = int(f.read(1))
...     size = {1: 52, 2: 64}.get(elf_class)
...     elf_header = f.read(size - 5)
Ob der Python-Interpreter eine ELF-Datei ist und deren ELF-Header. Dieser Ansatz wird verwendet, um die Zielarchitektur der Installation zu identifizieren (Beispiel). Unterscheidet sich je nach Installation.
>>> sys.float_info
sys.float_info(
   max=1.7976931348623157e+308,
   max_exp=1024,
   max_10_exp=308,
   min=2.2250738585072014e-308,
   min_exp=-1021,
   min_10_exp=-307,
   dig=15,
   mant_dig=53,
   epsilon=2.220446049250313e-16,
   radix=2,
   rounds=1,
)
Niedrigstufige Informationen über den Fließkommatyp, wie in float.h definiert. Unterscheidet sich je nach Architektur und Plattform.
>>> sys.getandroidapilevel()
21
Ganzzahl, die das Android-API-Level darstellt. Unterscheidet sich je nach Plattform.
>>> sys.getwindowsversion()
sys.getwindowsversion(
   major=10,
   minor=0,
   build=19045,
   platform=2,
   service_pack='',
)
Windows-Version des Systems. Unterscheidet sich je nach Plattform.
>>> sys.hexversion
0x30b03f0
Python-Version als Ganzzahl codiert. Unterscheidet sich je nach Python-Sprachversion.
>>> sys.implementation
namespace(
   name='cpython',
   cache_tag='cpython-311',
   version=sys.version_info(
      major=3,
      minor=11,
      micro=3,
      releaselevel='final',
      serial=0,
   ),
   hexversion=0x30b03f0,
   _multiarch='x86_64-linux-gnu',
)
Interpreter-Implementierungsdetails. Unterscheidet sich je nach Interpreter-Implementierung, Python-Sprachversion und Implementierungsversion – falls vorhanden. Kann auch Architekturspezifische Informationen enthalten, daher kann es sich auch je nach Systemarchitektur unterscheiden.
>>> sys.int_info
sys.int_info(
   bits_per_digit=30,
   sizeof_digit=4,
   default_max_str_digits=4300,
   str_digits_check_threshold=640,
)
Niedrigstufige Informationen über Pythons interne Ganzzahlendarstellung. Unterscheidet sich je nach Architektur, Plattform, Implementierung, Build und Laufzeit-Flags.
>>> sys.maxsize
0x7fffffffffffffff
Maximaler Wert, den eine Variable vom Typ Py_ssize_t annehmen kann. Unterscheidet sich je nach Architektur, Plattform und Implementierung.
>>> sys.maxunicode
0x10ffff
Wert des größten Unicode-Codepunkts. Unterscheidet sich je nach Implementierung und bei Python-Versionen vor 3.3, dem Build.
>>> sys.platform
linux
Plattformidentifikator. Unterscheidet sich je nach Plattform.
>>> sys.prefix
/usr
Präfix der site-spezifischen Verzeichnisse, in denen plattformabhängige Dateien installiert werden. Da es sich um die site-spezifischen Verzeichnisse handelt, ist es bei der Standardimplementierung von virtuellen Umgebungen ein Pfad, der für virtuelle Umgebungen spezifisch ist. Unterscheidet sich je nach Plattform, Installation und Umgebung.
>>> sys.platlibdir
lib
Plattformspezifisches Verzeichnis für Bibliotheken. Unterscheidet sich je nach Plattform und Anbieter.
>>> sys.version_info
sys.version_info(
   major=3,
   minor=11,
   micro=3,
   releaselevel='final',
   serial=0,
)
Python-Sprachversion, die vom Interpreter implementiert wird. Ändert sich, wenn die Ziel-Python-Version nicht dieselbe ist [4].
>>> sys.thread_info
sys.thread_info(
   name='pthread',
   lock='semaphore',
   version='NPTL 2.37',
)
Informationen über die Thread-Implementierung. Unterscheidet sich je nach Plattform und Implementierung.
>>> sys.winver
3.8-32
Versionsnummer, die zum Erstellen von Windows-Registrierungsschlüsseln verwendet wird. Unterscheidet sich je nach Plattform und Implementierung.
>>> sysconfig.get_config_vars()
{ ... }
>>> sysconfig.get_config_var(...)
...
Konfigurationsvariablen der Python-Distribution. Sie enthält eine Reihe von Variablen [5] – wie prefix, exec_prefix usw. – basierend auf dem laufenden Kontext [6], und kann einige zusätzliche Variablen basierend auf der Python-Implementierung und dem System enthalten.

In CPython und den meisten anderen Implementierungen, die dasselbe Build-System verwenden, sind die oben erwähnten "zusätzlichen" Variablen: unter POSIX alle Variablen aus dem Makefile, das zum Erstellen des Interpreters verwendet wird, und unter Windows umfasst es normalerweise nur eine kleine Teilmenge davon [7] – wie EXT_SUFFIX, BINDIR usw.

Dies ist implementierungsabhängig, aber es unterscheidet sich **normalerweise** zwischen nicht identischen Builds. Bitte beziehen Sie sich auf die Tabelle sysconfig-Konfigurationsvariablen für einen Überblick über die verschiedenen Konfigurationsvariablen, die normalerweise vorhanden sind.

CPython (und ähnliche)

sysconfig-Konfigurationsvariablen
Name Beispielwert Description Varianz
SOABI cpython-311-x86_64-linux-gnu ABI-String – definiert durch PEP 3149. Unterscheidet sich je nach Implementierung, Systemarchitektur, Python-Sprachversion und Implementierungsversion – falls vorhanden.
SHLIB_SUFFIX .so Suffix der Shared Library. Unterscheidet sich je nach Plattform.
EXT_SUFFIX .cpython-311-x86_64-linux-gnu.so Interpreter-spezifisches Python-Erweiterungs-Suffix (natives Modul) – im Allgemeinen definiert als .{SOABI}.{SHLIB_SUFFIX}. Unterscheidet sich je nach Implementierung, Systemarchitektur, Python-Sprachversion und Implementierungsversion – falls vorhanden.
LDLIBRARY libpython3.11.so Name der Shared libpython Bibliothek – falls verfügbar. Wenn nicht verfügbar [8], ist die Variable leer. Wenn verfügbar, sollte die Bibliothek in LIBDIR liegen. Unterscheidet sich je nach Implementierung, Systemarchitektur, Build-Konfiguration, Python-Sprachversion und Implementierungsversion – falls vorhanden.
PY3LIBRARY libpython3.so Name der Shared-Bibliothek libpython nur für Python 3 (nur Hauptversionsbindung) [9] – falls verfügbar. Wenn nicht verfügbar [8], ist die Variable leer. Wenn verfügbar, sollte die Bibliothek in LIBDIR liegen. Unterscheidet sich je nach Implementierung, Systemarchitektur, Build-Konfiguration, Python-Sprachversion und Implementierungsversion – falls vorhanden.
LIBRARY libpython3.11.a Name der statischen libpython Bibliothek – falls verfügbar. Wenn nicht verfügbar [8], ist die Variable leer. Wenn verfügbar, sollte die Bibliothek in LIBDIR liegen. Unterscheidet sich je nach Implementierung, Systemarchitektur, Build-Konfiguration, Python-Sprachversion und Implementierungsversion – falls vorhanden.
Py_DEBUG 0 Ob dies ein Debug-Build ist. Unterscheidet sich je nach Build-Konfiguration.
WITH_PYMALLOC 1 Ob dieser Build die Pymalloc-Unterstützung hat. Unterscheidet sich je nach Build-Konfiguration.
Py_TRACE_REFS 0 Ob die Referenzverfolgung (nur Debug-Build) aktiviert ist. Unterscheidet sich je nach Build-Konfiguration.
Py_UNICODE_SIZE Größe des Py_UNICODE-Objekts in Bytes. Diese Variable ist nur in CPython-Versionen vor 3.3 vorhanden und wurde üblicherweise verwendet, um zu erkennen, ob der Build UCS2 oder UCS4 für Unicode-Objekte verwendet – vor PEP 393. Unterscheidet sich je nach Build-Konfiguration.
Py_ENABLE_SHARED 1 Ob eine Shared libpython verfügbar ist. Unterscheidet sich je nach Build-Konfiguration.
PY_ENABLE_SHARED 1 Ob eine Shared libpython verfügbar ist. Unterscheidet sich je nach Build-Konfiguration.
CC gcc Der C-Compiler, der zum Erstellen der Python-Distribution verwendet wurde. Unterscheidet sich je nach Build-Konfiguration.
CXX g++ Der C-Compiler, der zum Erstellen der Python-Distribution verwendet wurde. Unterscheidet sich je nach Build-Konfiguration.
CFLAGS -DNDEBUG -g -fwrapv ... Die C-Compiler-Flags, die zum Erstellen der Python-Distribution verwendet wurden. Unterscheidet sich je nach Build-Konfiguration.
py_version 3.11.3 Vollständige Form der Python-Version. Unterscheidet sich je nach Python-Sprachversion.
py_version_short 3.11 Benutzerdefinierte Form der Python-Version, die nur die Haupt- und Nebenversionsnummern enthält. Unterscheidet sich je nach Python-Sprachversion.
py_version_nodot 311 Benutzerdefinierte Form der Python-Version, die nur die Haupt- und Nebenversionsnummern ohne Punkte enthält. Unterscheidet sich je nach Python-Sprachversion.
prefix /usr Siehe sys.prefix, siehe Eintrag in der obigen Tabelle. Unterscheidet sich je nach Plattform, Installation und Umgebung.
base /usr Siehe sys.prefix, siehe Eintrag in der obigen Tabelle. Unterscheidet sich je nach Plattform, Installation und Umgebung.
exec_prefix /usr Siehe sys.exec_prefix, siehe Eintrag in der obigen Tabelle. Unterscheidet sich je nach Plattform, Installation und Umgebung.
platbase /usr Siehe sys.exec_prefix, siehe Eintrag in der obigen Tabelle. Unterscheidet sich je nach Plattform, Installation und Umgebung.
installed_base /usr Siehe sys.base_prefix, siehe Eintrag in der obigen Tabelle. Unterscheidet sich je nach Plattform und Installation.
installed_platbase /usr Siehe sys.base_exec_prefix, siehe Eintrag in der obigen Tabelle. Unterscheidet sich je nach Plattform und Installation.
platlibdir lib Siehe sys.platlibdir, siehe Eintrag in der obigen Tabelle. Unterscheidet sich je nach Plattform und Anbieter.
SIZEOF_* 4 Größe eines bestimmten C-Typs (double, float usw.). Unterscheidet sich je nach Systemarchitektur und Build-Details.

Relevante Informationen

Es gibt einige Informationen, die von Build-Systemen benötigt werden – z. B. plattformspezifische Besonderheiten –, die über viele Stellen verstreut sind, und es ist oft schwierig, Code mit Annahmen zu identifizieren, die darauf basieren. In diesem Abschnitt versuchen wir, die relevantesten Fälle zu dokumentieren.

Wann sollten Erweiterungen gegen libpython gelinkt werden?

Kurze Antwort
Ja, unter Windows. Nein, auf POSIX-Plattformen, außer Android, Cygwin und anderen Windows-basierten POSIX-ähnlichen Plattformen.

Beim Erstellen von Erweiterungen für die dynamische Ladung müssen diese je nach Zielplattform möglicherweise gegen libpython gelinkt werden.

Unter Windows müssen Erweiterungen gegen libpython gelinkt werden, da alle Symbole zur Linkzeit auflösbar sein müssen. POSIX-ähnliche Plattformen, die auf Windows basieren – wie Cygwin, MinGW oder MSYS –, erfordern ebenfalls das Linken gegen libpython.

Auf den meisten POSIX-Plattformen ist es nicht notwendig, gegen libpython zu linken, da die Symbole aufgrund des Interpreters – oder, bei Einbettung, der betreffenden ausführbaren Datei/Bibliothek –, die bereits gegen libpython linken, bereits verfügbar sind. Das Nicht-Linken eines Erweiterungsmoduls gegen libpython ermöglicht, dass es von statischen Python-Builds geladen werden kann. Daher ist es, wenn möglich, wünschenswert, dies zu tun (siehe GH-65735).

Dies ist möglicherweise nicht auf allen POSIX-Plattformen der Fall, prüfen Sie dies daher sorgfältig. Ein Beispiel ist Android, wo nur die Haupt-Executable und LD_PRELOAD-Einträge als RTLD_GLOBAL betrachtet werden (was bedeutet, dass Abhängigkeiten RTLD_LOCAL sind) [10], was dazu führt, dass die libpython-Symbole beim Laden der Erweiterung nicht verfügbar sind.

Was sind prefix, exec_prefix, base_prefix und base_exec_prefix?

Dies sind `sys`-Attribute bei der Python-Initialisierung, die die laufende Umgebung beschreiben. Sie beziehen sich auf das Präfix der Verzeichnisse, in denen Installations-/Umgebungsdateien gemäß der folgenden Tabelle installiert werden.

Name Zieldateien Umgebungsumfang
prefix Plattformunabhängig (z. B. reines Python) Site-spezifisch
exec_prefix Plattformabhängig (z. B. native Code) Site-spezifisch
base_prefix Plattformunabhängig (z. B. reines Python) Installationsweit
base_exec_prefix Plattformabhängig (z. B. native Code) Installationsweit

Da die site-spezifischen Präfixe in virtuellen Umgebungen unterschiedlich sind, wird häufig die Überprüfung sys.prexix != sys.base_prefix verwendet, um zu prüfen, ob wir uns in einer virtuellen Umgebung befinden.

Fallstudien

crossenv

Beschreibung:
Virtuelle Umgebungen für die Cross-Kompilierung von Python-Erweiterungsmodulen.
URL:
https://github.com/benfogle/crossenv

crossenv ist ein Werkzeug zur Erstellung einer virtuellen Umgebung mit einer "monkeypatchten" Python-Installation, die in bestimmten Szenarien versucht, die Zielmaschine zu emulieren. Mehr zu diesem Ansatz finden Sie im Abschnitt Vortäuschen der Zielumgebung.

conda-forge

Beschreibung:
Eine Community-gesteuerte Sammlung von Rezepten, Build-Infrastrukturen und Distributionen für den conda-Paketmanager.
URL:
https://conda-forge.org/

XXX: Jaime wird eine kurze Zusammenfassung schreiben, sobald der PEP-Entwurf öffentlich ist.

XXX Verwendet einen modifizierten crossenv.

Yocto Project

Beschreibung:
Das Yocto Project ist ein Open-Source-Kollaborationsprojekt, das Entwicklern hilft, benutzerdefinierte Linux-basierte Systeme unabhängig von der Hardwarearchitektur zu erstellen.
URL:
https://www.yoctoproject.org/

XXX: E-Mail an die Mailingliste gesendet.

TODO

Buildroot

Beschreibung:
Buildroot ist ein einfaches, effizientes und einfach zu bedienendes Werkzeug zur Generierung von Embedded-Linux-Systemen durch Cross-Kompilierung.
URL:
https://buildroot.org/

TODO

Pyodide

Beschreibung:
Pyodide ist eine Python-Distribution für den Browser und Node.js, basierend auf WebAssembly.
URL:
https://pyodide.org/en/stable/

XXX: Hood sollte diesen Abschnitt überprüfen/erweitern.

Pyodide stellt eine Python-Distribution bereit, die mit dem Emscripten-Toolchain auf WebAssembly kompiliert wurde.

Es werden mehrere Aspekte der CPython-Installation und einiger externer Komponenten gepatcht. Ein benutzerdefinierter Paketmanager – micropip – der sowohl Pure- als auch wasm32/Emscripten-Wheels unterstützt, wird ebenfalls als Teil der Distribution bereitgestellt. Darüber hinaus wird ein Repository mit einer ausgewählten Reihe von Drittanbieterpaketen bereitgestellt und ist standardmäßig aktiviert.

Beeware

Beschreibung:
BeeWare ermöglicht es Ihnen, Ihre App in Python zu schreiben und sie auf mehreren Plattformen zu veröffentlichen.
URL:
https://beeware.org/

TODO

python-for-android

Beschreibung:
Verwandeln Sie Ihre Python-Anwendung in ein Android-APK.
URL:
https://github.com/kivy/python-for-android

Ressource https://github.com/Android-for-Python/Android-for-Python-Users

python-for-android ist ein Werkzeug zum Verpacken von Python-Apps unter Android. Es erstellt eine Python-Distribution mit Ihrer App und deren Abhängigkeiten.

Pure-Python-Abhängigkeiten werden automatisch und auf generische Weise behandelt, aber native Abhängigkeiten erfordern Rezepte. Eine Reihe von Rezepten für beliebte Abhängigkeiten wird bereitgestellt, aber Benutzer müssen ihre eigenen Rezepte für alle anderen nativen Abhängigkeiten bereitstellen.

kivy-ios

Beschreibung:
Toolchain zum Kompilieren von Python / Kivy / anderen Bibliotheken für iOS.
URL:
https://github.com/kivy/kivy-ios

kivy-ios ist ein Werkzeug zum Verpacken von Python-Apps unter iOS. Es stellt eine Toolchain zur Erstellung einer Python-Distribution mit Ihrer App und deren Abhängigkeiten bereit, sowie eine CLI zur Erstellung und Verwaltung von Xcode-Projekten, die mit der Toolchain integriert werden.

Es verwendet denselben Ansatz wie python-for-android (ebenfalls gepflegt vom Kivy-Projekt) für App-Abhängigkeiten – Pure-Python-Abhängigkeiten werden automatisch behandelt, aber native Abhängigkeiten erfordern Rezepte, und das Projekt stellt Rezepte für beliebte Abhängigkeiten bereit.

AidLearning

Beschreibung:
KI, Android, Linux, ARM: KI-Anwendungsentwicklungsplattform basierend auf der integrierten Ökologie von Android+Linux.
URL:
https://github.com/aidlearning/AidLearning-FrameWork

TODO

QPython

Beschreibung:
QPython ist die Python-Engine für Android.
URL:
https://github.com/qpython-android/qpython

TODO

pyqtdeploy

Beschreibung:
pyqtdeploy ist ein Werkzeug zur Bereitstellung von PyQt-Anwendungen.
URL:
https://www.riverbankcomputing.com/software/pyqtdeploy/

Kontakt https://www.riverbankcomputing.com/pipermail/pyqt/2023-May/thread.html Phil, den Maintainer kontaktiert

TODO

Chaquopy

Beschreibung:
Chaquopy bietet alles, was Sie benötigen, um Python-Komponenten in eine Android-App zu integrieren.
URL:
https://chaquo.com/chaquopy/

TODO

EDK II

Beschreibung:
EDK II ist eine moderne, funktionsreiche, plattformübergreifende Firmware-Entwicklungsumgebung für die UEFI- und PI-Spezifikationen.
URL:
https://github.com/tianocore/edk2-libc/tree/master/AppPkg/Applications/Python

TODO

ActivePython

Beschreibung:
Kommerzielle, qualitätsgesicherte Python-Distribution, die sich auf einfache Installation und plattformübergreifende Kompatibilität unter Windows, Linux, Mac OS X, Solaris, HP-UX und AIX konzentriert.
URL:
https://www.activestate.com/products/python/

TODO

Termux

Beschreibung:
Termux ist ein Android-Terminalemulator und eine Linux-Umgebungs-App, die direkt und ohne Rooting oder Setup funktioniert.
URL:
https://termux.dev/en/

TODO


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

Zuletzt geändert: 2025-05-06 20:54:51 GMT