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
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 |
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. |
Makefile verwenden, sondern stattdessen das Visual Studio Build-System verwenden. Eine Teilmenge der wichtigsten Makefile-Variablen wird bereitgestellt, um Benutzercode, der sie verwendet, einfacher zu machen.CPython (und ähnliche)
| 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. |
libpython kompiliert wurde.libpython Bibliothek, gegen die Benutzer der Stable ABI linken sollten, wenn sie gegen libpython linken müssen.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