Richtlinien für die Python-Paketierung
Diese Version der Python-Paketbaurichtlinien ist seit 2021 gültig und stellt eine grundlegende Überarbeitung und einen Paradigmenwechsel dar. Nicht alle Pakete wurden entsprechend aktualisiert. Ältere Richtlinien werden als historische Referenz aufbewahrt, dürfen aber von neuen Paketen NICHT verwendet werden. Bestehende Pakete MÜSSEN auf die aktuellen Python-Richtlinien umgestellt werden:
-
Python-Paketbaurichtlinien der 201x-Ära (Pakete, die diese verwenden, nutzen normalerweise das veraltete
%py3_installoder%py3_install_wheelMakro oder rufensetup.py installauf.)
| Diese Richtlinien gelten nur für aktuelle Fedora-Versionen. Für ältere Versionen (z.B. EPEL 8) lesen Sie bitte die Richtlinien aus der 201x-Ära. |
Die beiden unten aufgeführten Distributionsweite Richtlinien gelten für alle Software in Fedora, die Python zur Bau- oder Laufzeit verwendet.
Die übrigen Richtlinien gelten für Pakete, die Code enthalten, der mit der import-Anweisung von Python importiert werden kann. Konkret betrifft dies alle Pakete, die Dateien unter /usr/lib*/python*/ installieren.
Mit Ausnahme der beiden „distributionsweiten Richtlinien“ gelten diese Richtlinien nicht für einfache Skripte oder Hilfsprogramme, die aus einer einzigen Datei bestehen, insbesondere wenn diese in Software enthalten sind, die nicht in Python geschrieben ist. Benötigt eine Anwendung (z.B. ein Befehlszeilenwerkzeug, ein Skript oder eine GUI-Anwendung) jedoch eine komplexere Python-Bibliothek, SOLLTE diese Bibliothek gemäß diesen Richtlinien als importierbare Bibliothek paketiert werden.
Ein Hauptziel für die Python-Paketierung in Fedora ist die Harmonisierung mit dem breiteren Python-Ökosystem, d. h. mit den Standards der Python Packaging Authority (PyPA) und dem Python Package Index (PyPI). Paketierer SOLLTEN bereit sein, sich an Upstream-Projekten zu beteiligen, um die hier beschriebenen Best Practices zu etablieren. Wir möchten sowohl Fedora als auch das gesamte Python-Ökosystem verbessern.
Einige Bauwerkzeuge (wie CMake oder Autotools) sind möglicherweise noch nicht zu den neuesten PyPA-Standards kompatibel. (Beispielsweise erzeugen sie möglicherweise .egg-info-Verzeichnisse anstelle von .dist-info.) Obwohl die normativen Punkte dieses Dokuments (MUSS/SOLLTE) vom jeweiligen Werkzeug unabhängig sind, sind viele der praktischen Tipps und Hilfsmakros nicht anwendbar. Falls dies auf Sie zutrifft, wenden Sie sich bitte an die Python SIG, um Unterstützung zu erhalten, und/oder befolgen Sie vorerst die älteren Richtlinien.
|
| Die Python SIG von Fedora entwickelt nicht nur diese Richtlinien, sondern ist auch an den PyPA-Standards und Best Practices für die Python-Paketierung beteiligt. Schauen Sie in das Wiki oder die Mailingliste, falls Sie Hilfe benötigen oder mithelfen möchten. |
Distributionsweite Richtlinien
Bauabhängigkeit von python3-devel
Jedes Paket, das Python (zur Laufzeit und/oder während des Bauvorgangs) verwendet
und/oder Python-Module installiert, MUSS eine Bauabhängigkeit von
python3-devel haben, selbst wenn Python während des Bauprozesses
nicht tatsächlich aufgerufen wird. Ein solches Paket muss eine der
folgenden Optionen in seiner .spec-Datei verwenden:
-
%pyproject_buildrequiresim Abschnitt%generate_buildrequires -
BuildRequires: python3-devel
Eine transitive Bauabhängigkeit von python3-devel allein reicht nicht aus. Wenn das Paket einen alternativen Python-Interpreter anstelle von python3 verwendet (z.B. pypy, jython, python2.7), KANN es stattdessen das entsprechende *-devel-Paket benötigen.
Das Paket *-devel bindet relevante RPM-Makros ein. Es ermöglicht außerdem automatisierte oder manuelle Prüfungen: Beispielsweise nutzen Python-Entwickler diese Abhängigkeit, um Pakete aufzulisten, die Python in irgendeiner Weise verwenden und von geplanten Änderungen betroffen sein könnten.
Obligatorische Makros
Die folgenden Makros MÜSSEN verwendet werden, wo immer es möglich ist.
Die in Klammern stehenden Expansionen dienen lediglich als Referenz bzw. Beispiele.
Die Makros sind in allen unterstützten Fedora- und EPEL-Versionen für Sie definiert.
-
%{python3}(/usr/bin/python3): Der Python-Interpreter. Zum Beispiel sollte dieses Makro verwendet werden, um Python aus einem Skript in einerspec-Datei aufzurufen, anconfigure-Skripte übergeben werden, um eine ausführbare Python-Datei auszuwählen, oder als%{python3} -m pipverwendet werden, um ein Python-basiertes Werkzeug auszuführen.Wenn die paketierte Software Python zur Laufzeit aufruft (und nicht zum Kompilieren/Testen), kann es erforderlich sein, die entsprechenden Flags an
%{python3}zu übergeben, um sie von benutzerinstallierten Paketen zu isolieren. Weitere Informationen finden Sie unter Shebangs. -
%{python3_version}(z.B.3.9,3.10): Version des Python-Interpreters. -
%{python3_version_nodots}(z.B.39,310): Version des Python-Interpreters ohne Punkt. -
%{python3_sitelib}(z.B./usr/lib/python3.9/site-packages): Installationsort reiner Python-Module. -
%{python3_sitearch}(z.B./usr/lib64/python3.9/site-packages): Installationsort der Python-Erweiterungsmodule (nativer Code, z.B. aus C kompiliert).
Im restlichen Teil dieses Dokuments werden diese Makros zusammen mit %{_bindir}(/usr/bin/) anstelle der rohen Pfadnamen verwendet.
Unterstützung für Python-Implementierungen
Fedora zielt primär auf CPython ab, die Referenzimplementierung der Programmiersprache Python. Wir verwenden „Python“ im Allgemeinen synonym mit CPython.
Alternative Implementierungen wie pypy sind verfügbar, bieten aber derzeit keine umfassenden Werkzeuge und Richtlinien für die Paketierung. Bei der Verwendung dieser Implementierungen gibt es keine festen Regeln (abgesehen von den allgemeinen Fedora-Paketbaurichtlinien). Bitte versuchen Sie jedoch, den Sinn dieser Richtlinien zu beachten. Im Zweifelsfall konsultieren Sie die Python SIG.
Python-Versionsunterstützung
Fedora-Pakete DÜRFEN NICHT von anderen Versionen des CPython-Interpreters als der aktuellen Version python3 abhängen.
In Fedora sind Python-Bibliotheken für eine einzige Python-Version, genannt python3, paketiert. In Fedora 32 entspricht python3 beispielsweise Python 3.8.
Früher gab es mehrere Python-Stacks, z.B. python3.7 und python2.7, die gleichzeitig auf demselben Rechner installiert werden konnten. Das ist auch bei einigen Projekten der Fall, die auf Fedora aufbauen, wie RHEL, EPEL und CentOS. Fedora könnte in Zukunft wieder parallel installierbare Stacks einführen (z. B. wenn ein Wechsel zu einer neuen Python-Version eine Übergangsphase erfordert oder wenn sich genügend interessierte Betreuer finden).
Fedora enthält zwar alternative Interpreterversionen, z.B. python2.7 oder python3.5, diese sind jedoch nur für Entwickler gedacht, die Upstream-Code testen müssen. Fehlerbehebungen und Sicherheitsaktualisierungen für diese Interpreter decken ausschließlich diesen Anwendungsfall ab. Pakete wie pip oder tox, die das Einrichten isolierter Umgebungen und die Installation von Drittanbieterpaketen darin ermöglichen, KÖNNEN diese Interpreter als Ausnahme von der obigen Regel verwenden, sofern dies mit den Betreuern des jeweiligen Python-Interpreters abgestimmt ist.
Benennung
Python-Pakete haben verschiedene Namen, die zwar synchron gehalten werden sollten, aber aus historischen oder praktischen Gründen manchmal voneinander abweichen. Sie lauten:
Einige Beispiele (sowohl gute als auch schlechte):
| Fedora-Komponente | Gebautes RPM | Projektname | Importierbares Module |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
An anderen Stellen in diesem Text beziehen sich die Metavariablen SRPMNAME, RPMNAME, PROJECTNAME`und `MODNAME auf diese Namen.
Kanonischer Projektname
Die meisten dieser Namen sind maschinenlesbare, Groß- und Kleinschreibung berücksichtigende Identifikatoren, aber der Projektname hat eine menschenfreundliche Semantik: Er ist von Groß- oder Kleinschreibung unabhängig und behandelt bestimmte Zeichenketten (wie ._-) speziell. Für die automatisierte Verwendung muss er in ein kanonisches Format normalisiert werden, das von Python-Werkzeugen und Diensten wie setuptools, pip und PyPI verwendet wird. Der kanonische Name des Projekts Django lautet beispielsweise django (in Kleinbuchstaben). Diese Normalisierung ist in PEP 503 definiert und wird von dem Makro %{py_dist_name} für die Fedora-Paketierung implementiert. Der kanonische Name wird ermittelt, indem der Projektname in Kleinbuchstaben umgewandelt und alle nicht-alphanumerischen Zeichen durch einzelne Bindestriche („-“) ersetzt werden. Beispiel: „The $$$ Tree“ wird zu „the-tree“.
An anderer Stelle in diesem Text bezieht sich die Metavariable DISTNAME auf die kanonische Form des Projektnamens.
Einschränkungen für Namen
Das Zeichen + in Namen von erstellten (d.h. nicht SRPM-)Paketen, die die Verzeichnisse .dist-info oder .egg-info enthalten, ist für Extras reserviert und DARF NICHT für andere Zwecke verwendet werden.
Ausnahmsweise können +-Zeichen *am Ende solcher Namen vorkommen.
Das Zeichen + löst den automatischen Abhängigkeitsgenerator für Extras aus.
Ersetzen Sie alle +-Zeichen im Upstream-Namen durch -. Lassen Sie die +-Zeichen am Anfang des Namens weg. Erwägen Sie, Provides für den ursprünglichen Namen mit +-Zeichen hinzuzufügen, um das Paket für Benutzer leichter auffindbar zu machen.
Bibliotheksnamen
Ein gebautes (d.h. nicht SRPM-)Paket für eine Python-Bibliothek MUSS mit dem Präfix python3- benannt werden. Ein Quellpaket, das hauptsächlich eine Python-Bibliothek enthält, MUSS mit dem Präfix python- benannt werden.
Der Name des Fedora-Pakets SOLLTE den [Kanonischen Projektnamen] enthalten. Wenn möglich, SOLLTE der Projektname mit dem Namen des importierbaren Hauptmoduls übereinstimmen, jedoch in Kleinbuchstaben und mit Unterstrichen (_) anstelle von Bindestrichen (-).
Wenn der Name des importierbaren Moduls und der Projektname nicht übereinstimmen, kommt es häufig zu Verwirrung bei den Nutzern. In diesem Fall SOLLTEN die Paketierer sicherstellen, dass die Upstream-Entwickler über das Problem informiert sind und (insbesondere bei neuen Paketen, bei denen eine Umbenennung möglich ist) eine Umbenennung anstreben. Die Python SIG steht Ihnen dabei gerne zur Seite.
Eine Python-Bibliothek ist ein Paket, das in Python importiert werden soll, beispielsweise mit import requests. Werkzeuge wie Ansible oder IDLE, deren Code zwar importierbar ist, aber nicht primär für den Import aus anderer Software gedacht ist, gelten in diesem Sinne nicht als Bibliotheken. Daher trifft dieser Abschnitt nicht auf sie zu. (Allgemeine Hinweise finden Sie in den allgemeinen Richtlinien für Bibliotheken und Anwendungen.)
Der Name einer Fedora-Komponente (Quellpaket) für eine Bibliothek sollte aus dem kanonischen Projektnamen gebildet werden, dem python- vorangestellt wird, sofern dieser nicht bereits mit python- beginnt. Dies kann zu Konflikten führen (z. B. zwischen bugzilla und python-bugzilla). In diesem Fall sollte sichergestellt werden, dass die Upstream-Entwickler über die potenziell verwirrende Namensgebung informiert sind und nach bestem Wissen und Gewissen entschieden wird.
Anwendungsnamen
Pakete, die primär Anwendungen, Dienste oder ausführbare Dateien jeglicher Art bereitstellen, SOLLTEN gemäß den allgemeinen Fedora-Benennungsrichtlinien benannt werden (z.B. ansible).
Erwägen Sie, eine virtuelles „Provides“ gemäß [Library naming] oben hinzuzufügen (z. B. python3-PROJEKTNAME), falls dies den Benutzern helfen würde, das Paket zu finden.
Einzubeziehende Dateien
Quelldateien und Bytecode-Zwischenspeicher
Pakete MÜSSEN die Quelldatei (*.py) UND den Bytecode-Cache (*.pyc) für jedes importierbare reine Python-Modul enthalten. Die Quelldateien MÜSSEN im selben Paket wie der Bytecode-Cache enthalten sein.
Skripte, die nicht importierbar sind (typischerweise solche in %{_bindir} oder %{_libexecdir}), SOLLTEN NICHT byte-kompiliert werden.
Die Cache-Dateien befinden sich in einem __pycache__-Verzeichnis und haben ein interpreterabhängiges Suffix wie .cpython-39.pyc.
Der Cache ist für die Ausführung der Software nicht erforderlich. Falls er jedoch nicht gefunden wird, versucht Python, ihn beim Import eines Moduls zu erstellen. Gelingt dies, wird die Datei nicht von RPM verfolgt und verbleibt nach der Deinstallation auf dem System. Schlägt die Erstellung fehl, können Benutzer fälschlicherweise SELinux-AVC-Fehler in den Protokollen erhalten.
Normalerweise übernimmt das BRP-Skript brp-python-bytecompile die Byte-Kompilierung (Erstellung der Cache-Dateien). Dieses Skript wird automatisch ausgeführt, nachdem der Abschnitt %install der Spec-Datei durchlaufen wurde. Es byte-kompiliert alle .py-Dateien, die es in %{python3_sitelib} oder %{python3_sitearch} findet.
Sie müssen diese Dateien in Ihr Paket einbinden (d.h. im Abschnitt %files).
Falls der Code sich in einem Unterverzeichnis befindet (importierbares Paket), binden Sie das ganze Verzeichnis ein:
%files
%{python3_sitelib}/foo/
Das Hinzufügen eines abschließenden Schrägstrichs ist für Verzeichnisse empfehlenswert.
Dies ist jedoch nicht für Module der obersten Ebene anwendbar (z.B. %{python3_sitelib}), da sowohl %{python3_sitelib} als auch %{python3_sitelib}/__pycache__/ zu Python selbst gehören. Hier kann das Makro %pycached Abhilfe schaffen. Es expandiert zur angegebenen *.py-Quelldatei und den zugehörigen Cache-Dateien. Zum Beispiel:
%files
%pycached %{python3_sitelib}/foo.py
expandiert ungefähr zu:
%files
%{python3_sitelib}/foo.py
%{python3_sitelib}/__pycache__/foo.cpython-3X{,.opt-?}.pyc
Manuelle Byte-Kompilierung
Falls Sie etwas außerhalb von %{python3_sitelib}/%{python3_sitearch} byte-kompilieren müssen, verwenden Sie das %py_byte_compile-Makro.
Wenn Ihre Software beispielsweise %{_datadir}/mypackage zum Importpfad von Python hinzufügt und das Paket foo von dort importiert, müssen Sie foo mit folgendem Code kompilieren:
%py_byte_compile %{python3} %{buildroot}%{_datadir}/mypackage/foo/
Dist-info-Metadaten
Jedes Python-Paket MUSS Paketverteilungsmetadaten enthalten, die den PyPA-Spezifikationen entsprechen (insbesondere Recording installed projects).
Die Metadaten SOLLTEN im selben Teilpaket wie das importierbare Hauptmodul enthalten sein, sofern ein solches existiert.
Dies gilt sowohl für Bibliotheken (z.B. python-requests) als auch für Werkzeuge (z.B. ansible).
Wenn Software in mehrere Teilpakete aufgeteilt wird, ist es in Ordnung, die Metadaten nur in einem einzigen RPM-Paket auszuliefern. In diesem Fall sollten Sie mit dem Upstream-Projekt zusammenarbeiten, um dieses ebenfalls aufzuteilen.
Die Metadaten liegen in Form eines .dist-info-Verzeichnisses vor, das in %{python3_sitelib} oder %{python3_sitearch} installiert ist und Informationen enthält, die Werkzeuge wie importlib.metadata zur Untersuchung installierter Bibliotheken verwenden.
Ein Projekt namens MyLib mit dem importierbaren Paket mylib könnte beispielsweise wie folgt paketiert werden:
%files -p python3-mylib
%{python3_sitelib}/mylib/
%{python3_sitelib}/MyLib-%{version}.dist-info/
%doc README.md
%license LICENSE.txt
Beachten Sie, dass einige ältere Werkzeuge Metadaten stattdessen in einem .egg-info-Verzeichnis oder sogar in einer einzelnen Datei speichern. Dies geschieht nicht, wenn Sie das Makro %pyproject_wheel verwenden. Falls Ihr Paket ein Bausystem verwendet, das ein .egg-info-Verzeichnis oder eine .egg-info-Datei erzeugt, wenden Sie sich bitte an die Python SIG.
Ausnahmsweise KANN die Python-Standardbibliothek auch ohne diese Metadaten ausgeliefert werden.
Explizite Listen
Pakete DÜRFEN KEINE gemeinsam genutzten Verzeichnisse besitzen, die Python selbst gehören, wie z.B. die Verzeichnisse der obersten Ebene __pycache__(%{python3_sitelib}/__pycache__, %{python3_sitearch}/__pycache__).
Ähnlich wie bei der allgemeinen Regel sollten Paketierer NICHT einfach alles unter einem gemeinsamen Verzeichnis globben.
Zusätzlich zu allgemeinen Listen sollte Folgendes NICHT in %files verwendet werden:
-
%{python3_sitelib}/* -
%{python3_sitearch}/* -
%{python_sitelib}/* -
%{python_sitearch}/* -
%pyproject_save_files '*' -
%pyproject_save_files +auto
Diese Regel dient als Kontrollmechanismus gegen häufige Fehler, die sonst schwer zu erkennen wären. Sie schränkt jedoch einige Automatisierungsmöglichkeiten ein.
Die häufigsten Fehler, die diese Regel verhindert, sind:
-
systemweite Installation einer Testsuite als importierbares Modul namens
test,was dann mit anderen solchen Paketen in Konflikt geraten würde, und -
wenn im Upstream-Projekt neue, unerwartete importierbare Module hinzugefügt werden, sollten Sie solche Änderungen immer auf Konflikte überprüfen und die Liste dieser Dateien explizit und nachvollziehbar halten.
PyPI-Parität
Jedes Python-Paket in Fedora SOLLTE auch auf dem Python Package Index (PyPI) verfügbar sein.
Der Befehl pip install PROJEKTNAME MUSS dasselbe Paket entweder installieren (möglicherweise in einer anderen Version), oder nichts installieren, oder mit einer aussagekräftigen Fehlermeldung fehlschlagen.
Wenn dies nicht der Fall ist, SOLLTE der Paketierer diesbezüglich Kontakt mit dem Upstream-Projekt aufnehmen. Ziel ist es, den Projektnamen auf PyPI registrieren oder sperren zu lassen oder anderweitig sicherzustellen, dass die Regel eingehalten wird.
Falls Ihr Paket nicht auf PyPI veröffentlicht ist oder nicht veröffentlicht werden kann, haben Sie folgende Möglichkeiten:
-
Bitten Sie die Upstream-Entwickler um Veröffentlichung
-
Wenn Sie möchten: Veröffentlichen Sie es selbst auf PyPI und pflegen Sie es
-
Bitten Sie die Python SIG, den Namen auf PyPI für Sie zu blockieren
-
Senden Sie eine E-Mail an die PyPI-Administratoren, um den Namen für Sie sperren zu lassen. Geben Sie dabei den Projektnamen an und erläutern Sie die Situation (z.B.: Das Paket kann derzeit nicht über
pipinstalliert werden). Fragen zum Vorgehen können Sie auf Python Discourse stellen oder den Prozess diskutieren.
Projektnamen, die in Fedora, aber nicht auf PyPI vorhanden waren, als diese Richtlinien vorgeschlagen wurden, können nicht auf PyPI hochgeladen werden. Dies verhindert, dass potenzielle Trolle sie übernehmen, blockiert aber auch die rechtmäßigen Eigentümer. Wenn Ihr Paket betroffen ist, kontaktieren Sie die Python SIG oder melden Sie ein PyPA-Problem und erwähnen Sie @encukou.
|
Falls der Projektname Ihres Pakets mit einem anderen Paket auf PyPI kollidiert, ändern Sie bitte den Projektnamen. So mühsam es auch ist, wir müssen im gesamten Python-Ökosystem einen einheitlichen globalen Namensraum verwenden. Software, die nicht speziell für Fedora geschrieben wurde, erwartet bereits, dass Projektnamen den PyPI-Namensraum verwenden: Wenn beispielsweise eine Drittanbieterbibliothek eine Abhängigkeit über ihren Namen identifiziert, soll diese Abhängigkeit nicht durch ein nicht zugehöriges Fedora-Paket erfüllt werden.
Wie immer können spezifische Ausnahmen vom Packaging Committee genehmigt werden.
Bereitstellungen und Abhängigkeiten
„Provides“ für importierbare Module
Für jedes Modul, das in Python 3 mit import MODULNAME verwendet werden soll, SOLLTE das Paket, das es enthält, python3-MODULNAME bereitstellen, wobei Unterstriche (_) durch Bindestriche (-) ersetzt werden.
Dies ist natürlich immer der Fall, wenn das Paket den Namen python3-MODULNAME trägt. Hat das Teilpaket einen anderen Namen, fügen Sie %py_provides python3-MODULNAME explizit hinzu. Weitere Informationen zu %py_provides finden Sie im folgenden Abschnitt.
Automatische python- und python3.X-Provides
Für jedes FOO sollte ein Paket, das python3-FOO bereitstellt, %py_provides oder einen automatischen Generator verwenden, um auch python-FOO und python3.X-FOO bereitzustellen, wobei X die Nebenversion des Interpreters ist.
Das „Provides“ SOLLTE NICHT manuell hinzugefügt werden: Wenn kein Generator oder Makro verwendet wird, fügen Sie die „Provides“ für python-FOO / python3.X-FOO überhaupt nicht hinzu.
Dies geschieht automatisch für Paketnamen durch einen Generator. Falls unbedingt erforderlich, kann der Generator deaktiviert werden, indem das [Makro %__pythonname_provides] undefiniert wird.
Für „Provides“, die keine Paketnamen sind, oder (aus technischen Gründen) für Pakete ohne Dateien, funktioniert der Generator nicht. In diesen Fällen liefert der folgende Aufruf „Provides“ für python3-FOO, python-FOO und python3.X-FOO:
%py_provides python3-FOO
Die Verwendung des Generators oder Makros ist wichtig, da sich die konkrete Form des „Provides“ in Zukunft ändern kann.
Maschinenlesbare Provides
Jedes Python-Paket MUSS python3dist(DISTNAME) und python3.Xdist(DISTNAME) bereitstellen, wobei X die Nebenversion des Interpreters und DISTNAME der [Canonical Project Name] ist, der den [Dist-info metadata] entspricht. python3-django würde beispielsweise python3dist(django) und python3.9dist(django) bereitstellen.
Dies wird automatisch aus den Dist-Info-Metadaten generiert. Die Bereitstellung SOLLTE NICHT manuell hinzugefügt werden: Falls die Generierung fehlschlägt, MÜSSEN die Metadaten korrigiert werden.
Diese Provides werden für automatisch generierte Requires verwendet.
Falls unbedingt erforderlich, kann der automatische Generator deaktiviert werden, indem das Makro %{?__pythondist_provides} undefiniert wird. Besprechen Sie Ihren Anwendungsfall gegebenenfalls mit der Python SIG.
Abhängigkeiten
Wie bereits oben erwähnt, MUSS jedes Python-Paket explizit python3-devel in „BuildRequires“ haben.
Pakete DÜRFEN KEINE Abhängigkeiten (weder zur Bau- noch zur Laufzeit) mit dem unversionierten Präfix python- haben, wenn stattdessen die entsprechende Abhängigkeit python3- verwendet werden kann.
Pakete SOLLTEN KEINE expliziten Abhängigkeiten (weder zur Bau- noch zur Laufzeit) mit einem Minor-Versionspräfix wie python3.8- oder python3.8dist( haben. Solche Abhängigkeiten SOLLTEN stattdessen automatisch generiert oder ein Makro verwendet werden, um die Version zu ermitteln.
Pakete SOLLTEN KEINE explizite Laufzeitabhängigkeit von python3 haben.
Anstatt von python3 abzuhängen, haben Pakete eine automatische Abhängigkeit von`python(abi) = 3.X, wenn sie Dateien nach%{python3_sitelib}` oder`%{python3_sitearch}` installieren, oder sie haben eine automatische Abhängigkeit von`/usr/bin/python3, wenn sie ausführbare Python-Skripte enthalten, oder sie haben eineautomatische Abhängigkeit vonlibpython3.X.so.1.0()`, wenn sie Python einbetten.
Diese Regeln tragen zu einem reibungslosen Aktualisierungsprozess bei, wenn python3 in neuen Versionen von Fedora aktualisiert wird.
Automatisch erzeugte Abhängigkeiten
Pakete MÜSSEN den automatischen Python-Laufzeitabhängigkeitsgenerator verwenden.
Pakete SOLLTEN nach Möglichkeit den optionalen Bauabhängigkeitsgenerator verwenden.
Der Paketierer MUSS die generierten Abhängigkeiten auf Korrektheit prüfen. Alle Abhängigkeiten MÜSSEN in der Zielversion von Fedora auflösbar sein.
Alle notwendigen Änderungen MÜSSEN durch Patches oder Modifizierung des Quellcodes (z.B. mit sed) erfolgen, anstatt den Generator zu deaktivieren. Die resultierende Änderung SOLLTE dem Upstream-Projekt angeboten werden. Ausnahmsweise DARF Filterung für temporäre Workarounds und Bootstrapping verwendet werden.
Abhängigkeiten, die bereits von den Generatoren abgedeckt werden, SOLLTEN NICHT in der .spec-Datei wiederholt werden. (Wenn der Generator beispielsweise eine requests-Abhängigkeit findet, ist Requires: python3-requests überflüssig.)
Die automatisch generierten Abhängigkeiten haben die Form python3.Xdist(DISTNAME), gegebenenfalls ergänzt durch Versionsabhängigkeiten oder kombiniert mit Rich-Abhängigkeiten. Alle Suffixe .0 werden aus den Versionsnummern entfernt, um dem Verhalten von Python-Tools zu entsprechen. (PEP 440 legt fest, dass X.Y und X.Y.0 als gleichwertig behandelt werden.)
Beachten Sie, dass die Generatoren nur Python-Pakete abdecken. Andere Abhängigkeiten, oft C-Bibliotheken wie openssl-devel, müssen manuell in der .spec-Datei angegeben werden.
Wo die Abhängigkeiten im Quellcode spezifiziert werden, hängt vom jeweiligen Bausystem und den Präferenzen des Projekts ab. Übliche Speicherorte sind pyproject.toml, setup.py, setup.cfg und config.toml.
Generator für Laufzeitabhängigkeiten
Der automatische Laufzeitabhängigkeitsgenerator verwendet Paketmetadaten (wie sie in den installierten *.dist-info-Verzeichnissen aufgezeichnet sind), um zu bestimmen, wovon das Paket abhängt.
Notfalls können Sie die Ausführung des „Requires“-Generators deaktivieren, indem Sie %{?python_disable_dependency_generator} zum Paket hinzufügen (normalerweise direkt vor der %description des Hauptpakets).
Generator für Bauabhängigkeiten
Der optionale (aber dringend empfohlene) Generator für Build-Abhängigkeiten sammelt Informationen aus den pyproject.toml-Bausysteminformationen (mit Ausweichen auf setuptools) sowie einen standardisierten Bausystem-Hook, um weitere Anforderungen zu ermitteln. Weitere Details finden Sie unter dem Makro %pyproject_buildrequires.
Beachten Sie, dass der Generator ohne das Flag -R die Laufzeitabhängigkeiten in BuildRequires einbindet. Dies ist nützlich, um Tests auszuführen und zu überprüfen, ob die Abhängigkeiten in Fedora verfügbar sind.
Testabhängigkeiten
Siehe den Tests-Abschnitt.
Extras
Python-Extras sind eine Möglichkeit für Python-Projekte, zu deklarieren, dass zusätzliche Abhängigkeiten für zusätzliche Funktionalität erforderlich sind.
Beispielsweise hat requests mehrere Standardabhängigkeiten (z.B. urllib3). Es deklariert aber auch ein Extra namens requests[security], das zusätzliche Abhängigkeiten auflistet (z.B. cryptography). Im Gegensatz zu RPM-Teilpaketen können Extras nur zusätzliche Abhängigkeiten, aber keine zusätzlichen Dateien angeben. Das Hauptpaket funktioniert auch ohne die optionale Abhängigkeit, allerdings mit eingeschränkter Funktionalität.
Python-Werkzeuge behandeln Extras als virtuelle Pakete. Wenn ein Benutzer beispielsweise pip install 'requests[security]' ausführt oder ein Projekt installiert, das von requests[security] abhängt, werden sowohl requests als auch cryptography installiert.
In Fedora werden Extras üblicherweise von Paketen ohne Dateien bereitgestellt. Anstelle von eckigen Klammern verwenden Fedora-Paketnamen konventionell das Zeichen + (das in RPM-Paketnamen zulässiig ist, jedoch nicht in kanonischen Python-Projektnamen oder in Extras-Bezeichnern).
Umgang mit Extras
Python-Pakete SOLLTEN „Provides“ für alle vom Upstream-Projekt spezifizierten Extras haben, außer:
-
solche, die für andere Pakete nicht nützlich sind (z.B. Bau-/Entwicklungsabhängigkeiten, üblicherweise
dev,docodertestgenannt), und -
diejenigen, deren Abhängigkeiten nicht in Fedora paketiert sind.
Ein Paket, das ein Python-Extra bereitstellt, MUSS Folgendes bereitstellen:`python3dist(DISTNAME[EXTRA])` und python3.Xdist(DISTNAME[EXTRA]),wobei X die Nebenversion des Interpreters, DISTNAME einKanonischer Projektname und EXTRA der Name eines einzelnen Extras ist.Zum Beispiel: python3.9dist(requests[security]). Diese Abhängigkeitgen*SOLLTEN* mithilfe des automatischen Abhängigkeitsgenerators generiert werden.
Ein Paket, das ein Python-Extra bereitstellt, MUSS das Hauptpaket des Extra mit exakter NEVR-Angabe benötigen.
Ein Teilpaket, das hauptsächlich ein Python-Extra bereitstellt, SOLLTE durch Anhängen von + und dem Namen des Extras an den Hauptpaketnamen benannt werden. Zum Beispiel: python3-requests+security.
Die einfachste Möglichkeit, zusätzliche Informationen bereitzustellen, ist die Verwendung eines dedizierten Teilpakets ohne Dateien (eines „Metapakets“). Dieser Vorgang kann mit dem Makro %pyproject_extras_subpkg oder dem Makro %python_extras_subpkg automatisiert werden.
Dies ist nicht die einzige Möglichkeit: Wenn ein Extra in einer Distribution immer nützlich ist, kann es vom Hauptpaket bereitgestellt werden; wenn mehrere Extras zusammengehören, können sie in einem einzigen Teilpaket enthalten sein. Die Verwendung eines eigenen Teilpakets pro Zusatzfunktion ermöglicht es Ihnen jedoch, den automatischen Abhängigkeitsgenerator zu nutzen, um sicherzustellen, dass die Abhängigkeiten der Extras mit denen des Hauptpakets synchron bleiben. Wenn Sie ein eigenes Teilpaket erstellen und es immer/üblicherweise installieren möchten, können Sie es im Hauptpaket als Requires/Recommends/Suggests einbinden.
Der Abhängigkeitsgenerator für Extras wird aktiviert, wenn Folgendes zutrifft:
-
Der Paketname muss mit
+EXTRAenden (wobeiEXTRAder Name des Extras ist). -
Das Paket muss das Verzeichnis
.dist-infoenthalten, üblicherweise als%ghost.
Beispiel und Hilfsmakros
Das zusätzliche Teilpaket für setuptools_scm[toml] kann mithilfe des Hilfsmakros %pyproject_extras_subpkg wie folgt angegeben werden. Das Makro benötigt den Namen des Hauptpakets und den/die Namen des/der Extra(s):
%pyproject_extras_subpkg -n python3-setuptools_scm toml
Wenn Sie nicht %pyproject_install verwenden, müssen Sie stattdessen %python_extras_subpkg verwenden und einen Pfad zum Verzeichnis dist-info angeben:
%python_extras_subpkg -n python3-setuptools_scm -i %{python3_sitelib}/*.dist-info toml
In diesem Fall liest der Generator für Extras-Abhängigkeiten die Upstream-Metadaten aus dem Verzeichnis .dist-info. Wenn er feststellt, dass das Extra toml benötigt, generiert er Requires: python3.Xdist(toml) und Provides: python3dist(setuptools-scm[toml]) (sowie die entsprechende python3.Xdist-Bereitstellung).
Falls Sie zusätzliche Funktionen benötigen, die die *_extras_subpkg-Makros nicht abdecken, müssen Sie die Teilpaketabschnitte manuell schreiben. Solche Funktionen können beispielsweise sein:
-
Obsoletes/Provides für andere Names (z.B. als veraltet zu markierende Extras-Pakete)
-
Manuelles Setzen harter oder weicher Abhängigkeiten zu anderen (evtl. Nicht-Python-)Paketen
Als Beispiel dafür, was Sie in diesen Fällen schreiben müssen, werden die beiden oben genannten Makroaufrufe *_extras_subpkg wie folgt expandiert:
%package -n python3-setuptools_scm+toml
Summary: Metapackage for python3-setuptools_scm: toml extra
Requires: python3-setuptools_scm = %{?epoch:%{epoch}:}%{version}-%{release}
%description -n python3-setuptools_scm+toml
This is a metapackage bringing in toml extra requires for python3-setuptools_scm.
It contains no code, just makes sure the dependencies are installed.
%files -n python3-setuptools_scm+toml
%ghost %{python3_sitelib}/*.dist-info
Beachten Sie, dass der Abhängigkeitsgenerator keine Abhängigkeit vom Hauptpaket hinzufügt (die Zeile Requires: python3-setuptools_scm = ... oben). Wenn Sie das Makro %python_extras_subpkg nicht verwenden, müssen Sie es manuell hinzufügen.
Extras entfernen
Wird ein bestehendes Extra aus einem übergeordneten Projekt entfernt, SOLLTE der Fedora-Betreuer versuchen, das Upstream-Projekt zur Wiedereinführung zu bewegen (mit einer leeren Abhängigkeitsliste). Gelingt dies nicht, SOLLTE die Erweiterung entweder aus dem Hauptpaket oder einem anderen Extra-Teilpaket entfernt und als veraltet markiert werden.
Beachten Sie, dass das Entfernen von Extras in der setuptools-Dokumentation nicht empfohlen wird (siehe den Tip-Kasten am Ende des Abschnitts Optional dependencies).
Automatische „Requires“ für Extras
Der automatische Generator für Laufzeitabhängigkeiten generiert Requires für`python3.Xdist(DISTNAME[EXTRA])` aus den Upstream-Metadaten Requires-Dist.
Falls das benötigte Paket noch keine Metadaten für das Extra bereitstellt, wenden Sie sich bitte an den Fedora-Betreuer, um diese hinzufügen zu lassen.
Im Notfall können Sie das Makro %_python_no_extras_requires definieren, um die automatische Generierung aller zusätzlichen Abhängigkeiten zu vermeiden.
Aufruf des Interpreters
Shebangs
Shebang-Zeilen zum Aufruf von Python MÜSSEN %{python3} als Interpreter verwenden.
Die Shebang-Zeilen zum Aufruf von Python SOLLTEN #!%{python3} -%{py3_shebang_flags} lauten und KÖNNEN zusätzliche Flags enthalten.
Falls (einige) der Standardflags aus the %{py3_shebang_flags} macro nicht erwünscht sind, SOLLTEN Pakete das Makro explizit neu definieren, um sie zu entfernen, indem sie das entsprechende %{_py3_shebang_...}-Makro undefinieren.
Die Verwendung von #!%{python3} (#!/usr/bin/python3) anstelle von z. B. #!/usr/bin/env python stellt sicher, dass der systemweite Python-Interpreter zum Ausführen des Codes verwendet wird, selbst wenn der Benutzer $PATH ändert (z.B. durch Aktivieren einer virtuellen Umgebung).
Standardmäßig wird -%{py3_shebang_flags} zu -sP expandiert (oder einfach zu -s bei Python-Versionen unter 3.11 und Fedora Linux-Versionen vor 37).
Das Flag -s, gespeichert in dem Makro %{_py3_shebang_s}, bedeutet, dass das Benutzerverzeichnis nicht zu sys.path hinzugefügt werden soll. Dadurch wird sichergestellt, dass die Python-Pakete des Benutzers (z.B. installiert mit pip install --user oder einfach im aktuellen Verzeichnis abgelegt) nicht mit der per RPM installierten Software in Konflikt geraten. Manchmal ist dies jedoch erwünscht, beispielsweise bei Plugins.
Das Flag -P, gespeichert in dem Makro %{_py3_shebang_P}, bedeutet, dass das Skriptverzeichnis nicht zu sys.path hinzugefügt werden soll. Manchmal ist es jedoch erwünscht, das Skriptverzeichnis zu sys.path hinzuzufügen, z.B. bei ausführbaren Python-Skripten, die in einem benutzerdefinierten Verzeichnis installiert sind und sich gegenseitig importieren.
Das Entfernen der unerwünschten Flags aus dem Makro %{py3_shebang_flags}, anstatt das Makro gar nicht zu verwenden, stellt sicher, dass bestehende oder zukünftige Automatisierungen das Flag nicht hinzufügen.
# -s aus dem Python-Shebang entfernen – um sicherzustellen, dass mit pip installierte
# Erweiterungen in Benutzerverzeichnissen erkannt und korrekt geladen werden
%undefine _py3_shebang_s
# -P nicht zu Python-Shebangs hinzufügen; die ausführbaren Python-Skripte in
# /usr/share/opt-viewer/ importieren sich gegenseitig
%undefine _py3_shebang_P
Das Makro %pyproject_install ändert automatisch alle Python-Shebangs in %{buildroot}%{_bindir}/* so, dass sie %{python3} verwenden, und fügt den Inhalt des Makros %{py3_shebang_flags}zu den bestehenden Flags hinzu. Wenn Sie dieses Makro nicht verwenden oder einen Shebang in einem anderen Verzeichnis ändern müssen, können Sie das Makro %py3_shebang_fix wie folgt verwenden:
%py3_shebang_fix SKRIPTNAME …
Aufrufbare Python-Module
Jedes ausführbare WERKZEUG, für das die aktuelle Python-Version relevant ist, SOLLTE auch mit python3 -m WERKZEUG aufrufbar sein.
Falls die Software diese Funktionalität nicht bietet, SOLLTEN die Paketierer die Upstream-Entwickler bitten, sie hinzuzufügen.
Dies gilt für Werkzeuge, die die aktuelle Python-Umgebung verändern (z.B. durch Installieren oder Abfragen von Paketen), Python zur Konfiguration verwenden oder Plugins mit Python ausführen. Es gilt nicht für Werkzeuge wie GIMP oder Bash, die Plugins in mehreren Sprachen unterstützen und/oder andere Möglichkeiten zur Angabe des Interpreters bieten.
Beispielsweise kann pip als python3 -m pip aufgerufen werden.
Dies ermöglicht es Benutzern, die zum Ausführen der Software verwendete Python-Version präzise anzugeben. Diese Konvention funktioniert in verschiedenen Umgebungen, in denen $PATH möglicherweise nicht immer konsistent gesetzt oder Skripte nicht einheitlich installiert werden.
Cython verwenden
Gemäß der allgemeinen Fedora-Richtlinie dürfen Pakete keine mit Cython vorab generierten Dateien verwenden. Diese müssen in %prep gelöscht und während des Bauprozesses neu generiert werden.
Ausnahmsweise DÜRFEN diese Quellen vorübergehend verwendet werden, um zirkuläre Abhängigkeiten zur Bauzeit zu vermeiden, indem man den Bootstrapping-Richtlinien folgt.
Die generierten Dateien (die gelöscht werden müssen) haben die generische Dateiendung .c oder .cpp. Cython-Quelldateien (die erhalten bleiben sollten) haben üblicherweise die Dateiendung .pyx oder .pxd.
Cython ist ein beliebtes Werkzeug zum Schreiben von Erweiterungsmodulen für Python. Es übersetzt eine Python-ähnliche Sprache in C, das dann an den C-Compiler übergeben wird. Früher war es schwierig, Cython als Abhängigkeit zur Bauzeit in den Quellcode einzubinden. Viele Projekte stellen daher vorab generierte C-Dateien in ihren Quellcode-Distributionen bereit, sodass Benutzer das Werkzeug nicht installieren müssen.
Cython nutzt aus Performancegründen die sich schnell ändernde interne API von CPython. Bei einer neuen Python-Version muss Cython in der Regel aktualisiert und die C-Dateien neu generiert werden. Unter Fedora ist dies häufig erforderlich, bevor die Upstream-Entwickler neu generierte Quellen veröffentlichen (z.B. für Alpha-Versionen von Python). Da wir keine Probleme mit Bauabhängigkeiten haben, führen wir den Cython-Schritt immer aus.
Beispielsweise entfernt PyYAML eine generierte C-Datei mit:
rm -rf ext/_yaml.c
Ein weiteres Beispiel: In python-lxml werden alle C-Dateien mit Cython generiert, wodurch sie sich mit folgendem Befehl entfernen lassen:
# die vorab generierten Cython C-Quellen entfernen
find -type f -name '*.c' -print -delete
Manche Upstream-Projekte vermischen generierte und manuell geschriebene C-Dateien. In solchen Fällen hilft ein grep-Befehl wie dieser von scipy (ist aber möglicherweise nicht völlig zukunftssicher):
# Vorab generierte Cython-C-Quellen entfernen
rm $(grep -rl '/\* Generated by Cython')
Tests
Tests ausführen
Falls eine Testsuite im Upstream-Projekt existiert, SOLLTE diese im Abschnitt %check ausgeführt werden. Ist dies mit zumutbarem Aufwand nicht möglich, MUSS zumindest ein einfacher Funktionstest (z.B. das Importieren des paketierten Moduls) im Abschnitt %check durchgeführt werden.
Sie DÜRFEN einzelne fehlgeschlagene Tests ausschließen. Sie DÜRFEN NICHT die gesamte Testsuite deaktivieren oder deren Ergebnis ignorieren, um einen Baufehler zu beheben.
Ausnahmsweise DÜRFEN Sie Tests mit einer entsprechenden %if-Bedingung deaktivieren (z.B. mit bcond beim Bootstrapping.
Die meisten Fehler in Python treten zur Laufzeit auf, daher sind Tests extrem wichtig, um Probleme aufzuspüren, insbesondere wenn Massen-Rebuilds erforderlich sind.
Häufige Gründe für das Überspringen von Tests in %check sind angeforderter Netzwerkzugriff, Abhängigkeiten, die nicht in Fedora paketiert sind, und/oder spezielle Hardware oder Ressourcen.
In diesen Fällen können Sie the`%pyproject_check_import oder the%py3_check_import` macro verwenden, um zu testen, ob installierte Module importierbar sind.
Tox
Ein beliebtes und in Fedora gut integriertes Testwerkzeug ist`tox. Es wird häufig verwendet, um Tests mit verschiedenen Python-Versionen durchzuführen. In einem Fedora-Paket werden die Test-Abhängigkeiten in den BuildRequires über%pyproject_buildrequires -t` oder -e (siehe Testabhängigkeiten unten) eingebunden und tox anschließend ausgeführt:
%tox
Dadurch werden die Umgebungsvariablen ($PATH, $PYTHONPATH, $TOX_TESTENV_PASSENV) eingerichtet und tox angewiesen, die aktuelle Umgebung zu verwenden, anstatt neue zu erstellen. Weitere Optionen finden Sie unter [Build macros].
pytest
Wenn das Upstream-Projekt tox nicht verwendet, müssen die Tests direkt ausgeführt werden, abhängig von der Wahl des Test-Runners durch das Upstream-Projekt. Ein gängiger Runner ist pytest, der mit %pytest aufgerufen werden kann.
Verwenden Sie Positionsargumente, um das Testverzeichnis anzugeben. Informationen zur Auswahl von Tests erhalten Sie mit python3 -m pytest --help. Wenn beispielsweise netzwerkbezogene Tests mit „network“ markiert sind, können Sie diese mit -m abwählen:
%pytest -m "not network"
Das Makro %pytest setzt mehrere Umgebungsvariablen, die für %check geeignet sind:
-
Orte im Buildroot werden zu
$PATHund$PYTHONPATHhinzugefügt. -
$PYTHONDONTWRITEBYTECODEist gesetzt, um zu verhindern, dass pytest-spezifische Cache-Dateien ins Buildroot geschrieben werden -
$PYTEST_XDIST_AUTO_NUM_WORKERSist auf%{_smp_build_ncpus}gesetzt -
Falls nicht gesetzt, werden
$CFLAGSund$LDFLAGSso gesetzt, dass sie den Bau-Flags entsprechen.
Andere Test-Runner
Falls das Upstream-Projekt weder tox noch pytest verwendet, können andere Test-Runner mit dem Makro <<`%{py3_test_envvars}`>> aufgerufen werden, das seit Fedora Linux 38 verfügbar ist.
Dieses Makro setzt mehrere Umgebungsvariablen ähnlich wie %pytest, erfordert aber, dass der eigentliche Test-Runner nach dem Makro aufgerufen wird, zum Beispiel:
%{py3_test_envvars} %{python3} -m unittest
Oder:
%{py3_test_envvars} %{python3} tests/run_tests.py
Testabhängigkeiten
Ein Teil des Python-Paketierungsökosystems, der noch immer nicht standardisiert ist, ist die Angabe von Testabhängigkeiten (und Entwicklungsabhängigkeiten im Allgemeinen).
Eine gute und gängige Methode für Upstream-Projekte, Testabhängigkeiten anzugeben, ist die Verwendung vonextra wie [test], [testing] oder [dev]. In diesem Fall könnten die Anweisungen des Upstream-Projekts zur Installation der Testabhängigkeiten wie $ pip install -e.[test] aussehen.
Eine weitere Möglichkeit, Testabhängigkeiten anzugeben, ist die Verwendung einer dedizierten Abhängigkeitsgruppe (PEP 735).
Projekte, die tox verwenden, geben Testabhängigkeiten üblicherweise in einem tox-spezifischen Format an, einem requires-Schlüssel in der Konfiguration.
Diese drei Formen werden durch das Makro%pyproject_buildrequires verarbeitet.
Falls die Upstream-Version keine der beiden Formen verwendet, listen Sie die Testabhängigkeiten manuell als BuildRequires in der spec-Datei auf, zum Beispiel:
# Testabhängigkeiten:
BuildRequires: python3dist(pytest)
Falls dies erforderlich ist, sollten Sie die Upstream-Entwickler bitten, ein zusätzliches [test] oder eine test-Abhängigkeitsgruppe hinzuzufügen.
Linter
In %check SOLLTEN Pakete KEINE „Linter“ ausführen: Code-Style-Checker,Testabdeckungs-Checker und andere Tools, die die Codequalität anstatt derFunktionalität überprüfen.
Werkzeuge wie black, pylint, flake8 oder mypy sind oft „meinungsbehaftet“ und ihre „Meinungen“ ändern sich so häufig, dass sie in Fedora lästig sind, da der Linter nicht an eine bestimmte Version gebunden ist. Darüber hinaus benötigen einige dieser Werkzeuge lange Zeit, um sich an neue Python-Versionen anzupassen, was frühe Tests mit Alpha- und Beta-Versionen von Python verhindert. Und sie sind schlichtweg unnötig: Falsch formatierter Code ist nicht wichtig genug, als dass der Fedora-Paketbetreuer die Entwickler deswegen kontaktieren müsste. Ein solches Problem einen Paketbaustein zerstören zu lassen, ist völlig unangemessen.
Linter sind in Upstream-CI durchaus sinnvoll. Aber nicht in Fedora.
Falls ein Linter verwendet wird, deaktivieren Sie ihn und entfernen Sie die Abhängigkeit davon. Falls dies nicht einfach ist, sprechen Sie mit den Upstream-Entwicklern darüber, wie dies vereinfacht werden kann (z.B. durch eine Konfigurationsoption oder eine separate tox-Umgebung).
Bei Paketen, die solche Linter enthalten, verwenden Sie diese zur Laufzeit oder erweitern Sie sie.Normalerweise müssen Sie den Linter in %check ausführen. Führen Sie ihn aus, um die Funktionalität zu testen, nicht die Codequalität der paketierten Software.
Quelldateien aus dem PyPI
Pakete DÜRFEN Quellen aus dem PyPI verwenden.
Allerdings SOLLTEN Pakete KEIN Archiv verwenden, das Test-Suites, Lizenzen und/oder Dokumentationen aus anderen Quellarchiven auslässt.
Zum Beispiel stellt pip zum jetzigen Zeitpunkt einen Quellcode-Tarball („sdist“) bereit, welches die relativ großen Verzeichnisse tests und docs auslässt, die sich in dem Quellcode auf GitHub befinden. In diesem Fall sollte der Tarball von GitHub verwendet werden. (Siehe Git-Tags in den Fedora SourceURL-Richtlinien.)
Bei der Verwendung von Quellen von PyPI können Sie das Makro the`%pypi_source` verwenden, um die korrekte URL zu generieren.
Einige Python-Pakete verwenden Metadaten von git (oder einem ähnlichen Versionsverwaltungssystem), um ihre Versionszeichenkette zu erstellen, beispielsweise über setuptools_scm. Beim Veröffentlichen eines Pakets auf PyPI werden diese Versionsmetadaten üblicherweise in einer Datei gespeichert und eingebunden, sodass die Versionshistorie nicht mehr benötigt wird. Bei der direkten Verwendung von Tarballs aus einem Git-Forge fehlen diese Versionsinformationen jedoch und müssen vom Paketierer manuell hinzugefügt werden. Beispielsweise kann die Umgebungsvariable SETUPTOOLS_SCM_PRETEND_VERSION in den Skripten %generate_buildrequires und %build in der Spec-Datei für Pakete, die setuptools_scm zu diesem Zweck verwenden, auf den gewünschten Wert gesetzt werden.
|
Beispiel-Spec-Datei
Nachfolgend finden Sie eine gültige Spec-Datei für eine Python-Bibliothek namens Pello, die den bewährten Vorgehensweisen für die Paketierung entspricht.
Beachten Sie, dass der Projektname Pello normalizesin Kleinbuchstaben pello umgewandelt wird. Die Beispiel-Spec-Datei zeigt, wo die einzelnen Varianten üblicherweise verwendet werden.
Das Projekt verfügt über ein extra namens color, das, wenn es installiert ist, eine farbige Ausgabe ermöglicht. Da die erforderliche Abhängigkeit sehr gering ist und die Farbgebung die Benutzerfreundlichkeit verbessert, wird dieses Extra aus dem Hauptpaket empfohlen.
Name: python-pello
Version: 1.0.4
Release: 1%{?dist}
Summary: Example Python library
License: MIT-0
URL: https://github.com/fedora-python/Pello
Source: %{url}/archive/v%{version}/Pello-%{version}.tar.gz
BuildArch: noarch
BuildRequires: python3-devel
%global _description %{expand:
A python module which provides a convenient example.
This description provides some details.}
%description %_description
%package -n python3-pello
Summary: %{summary}
Recommends: python3-pello+color
%description -n python3-pello %_description
%pyproject_extras_subpkg -n python3-pello color
%prep
%autosetup -p1 -n Pello-%{version}
%generate_buildrequires
%pyproject_buildrequires -t
%build
%pyproject_wheel
%install
%pyproject_install
# Hier ist „pello“ der Name des importierbaren Moduls.
%pyproject_save_files -l pello
%check
%tox
# Beachten Sie, dass es keinen %%files-Abschnitt für
# das nicht versionierte Python-Modul python-pello gibt.
# Für python3-pello verwaltet %%{pyproject_files} die Codedateien und %%license,
# aber ausführbare Dateien und Dokumentation müssen in der Spec-Datei aufgeführt werden:
%files -n python3-pello -f %{pyproject_files}
%doc README.md
%{_bindir}/pello_greeting
%changelog
Leere Spec-Datei
Nachfolgend finden Sie eine unvollständige Spec-Dateivorlage zum Kopieren, Einfügen und Bearbeiten.
Name: python-...
Version: ...
Release: 0%{?dist}
Summary: ...
License: ...
URL: https://...
Source: %{url}/archive/v%{version}/...-%{version}.tar.gz / %{pypi_source ...}
BuildArch: noarch / BuildRequires: gcc
BuildRequires: python3-devel
%global _description %{expand:
...}
%description %_description
%package -n python3-...
Summary: %{summary}
%description -n python3-... %_description
%prep
%autosetup -p1 -n ...-%{version}
%generate_buildrequires
%pyproject_buildrequires -x... / -g... / -t
%build
%pyproject_wheel
%install
%pyproject_install
%pyproject_save_files ...
%check
%tox / %pytest / %pyproject_check_import ...
%files -n python3-... -f %{pyproject_files}
%doc README.*
%{_bindir}/...
%changelog
Makro-Referenz
Dieser Abschnitt dokumentiert Makros, die bei der Python-Paketierung hilfreich sind. Die Expansionen in Klammern dienen lediglich als Referenz/Beispiele.
Schauen Sie im obigen Abschnitt Obligatorische Makros nach:
-
%{python3}(/usr/bin/python3) -
%{python3_version}(z.B.3.9) -
%{python3_version_nodots}(z.B.39) -
%{python3_sitelib}(z.B./usr/lib/python3.9/site-packages) -
%{python3_sitearch}(z.B./usr/lib64/python3.9/site-packages)
Shebang-Makros
-
%{py3_shebang_flags}(sPodersvor Fedora Linux 37)Flags für
%{python3}zur Verwendung in Shebangs. Details finden Sie unter Shebangs.Beinhaltet Flags aus mehreren hier aufgeführten%{_py3_shebang_...}-Makros.
-
%{_py3_shebang_s}(s)Undefinieren Sie dieses Makro, um
saus%{py3_shebang_flags}zu entfernen.
-
%{_py3_shebang_P}(P)Undefinieren Sie dieses Makro, um
Paus%{py3_shebang_flags}zu entfernen. Wurde in Fedora Linux 37 eingeführt.
-
%py3_shebang_fix PFADE(pathfix.py … PFADE)Ein Makro zum Korrigieren von Shebangs in angegebenen
PFADEN. Nur Shebangs, die bereitspythonenthalten, werden geändert. Wird ein Verzeichnis angegeben, werden alle darin enthaltenen.py-Dateien rekursiv korrigiert. (Wenn Sie also Shebangs in Dateien korrigieren müssen, die nicht*.pyheißen, müssen Sie jede Datei einzeln auflisten oder einen Shell-Glob verwenden, z.B.%{buildroot}%{_libexecdir}/mytool/*.) Vorhandene Flags bleiben erhalten und%{py3_shebang_flags}werden hinzugefügt.Beispielsweise wird
#! /usr/bin/env pythonin#!/usr/bin/python3 -sund#! /usr/bin/python -uin#!/usr/bin/python3 -sugeändert.Dieses Makro wird automatisch von
%pyproject_installfür%{buildroot}%{_bindir}/*aufgerufen.
Komfort-Makros
-
%{pypi_source PROJEKTNAME [VERSION [EXT]]}(z.B.https://.../Django-3.0.5.tar.gz)Wird zur entsprechenden URL des auf PyPI gehosteten Quellarchivs expandiert. Akzeptiertden Projektnamen und bis zu zwei optionale Argumente:
-
Die Version des PyPI-Projekts. Standardmäßig wird
%version(die Paketversion) verwendet, wobei alle~entfernt werden. -
Die zu verwendende Dateiendung. Standardmäßig wird
tar.gzverwendet.
In den meisten Fällen ist es nicht notwendig, diese beiden Argumente anzugeben.
Aus Gründen der Abwärtskompatibilität ist das erste Argument zwar rein technisch optional, es einfach wegzulassen ist jedoch als veraltet zu betrachten. (Standardmäßig wird
%srcnameverwendet, falls definiert, oder%pypi_name, falls definiert, oder%name.) -
-
%{python3_platform}(z.B.linux-x86_64)Der Plattformname. Wird in einigen Python-Bausystemen verwendet. Dies entsprichthttps://docs.python.org/3/library/sysconfig.html#sysconfig.get_platform[
sysconfig.get_platform()].
-
%{python3_ext_suffix}(z.B..cpython-39-x86_64-linux-gnu.so)Dateinamenerweiterung für Python-Erweiterungsmodule. Dies entspricht der sysconfig-Variable
EXT_SUFFIX.
-
%{python3_platform_triplet}(z.B.x86_64-linux-gnu)Eine Zeichenkette, die die Architektur/Plattform identifiziert. Dies entspricht der sysconfig-Variable
MULTIARCH.
-
%{python3_cache_tag}(z.B.cpython-311)Teil des Bytecode-Cache-Dateinamens, der den Interpreter identifiziert. Dies entspricht dem Wert von
sys.implementation.cache_tag.
Bau-Makros
Die „pyproject-Makros“ sind besonders nützlich für das Paketieren von Python-Projekten, die die in PEP 518 und PEP 517 definierte Datei pyproject.toml verwenden. Diese Datei spezifiziert die Bauabhängigkeiten des Pakets (einschließlich des Bausystems, z.B. setuptools, flit oder poetry).
Falls pyproject.toml nicht gefunden wird, greifen die Makros automatisch auf setuptools mit der Konfiguration in setup.cfg/setup.py zurück.
Eine vollständige Anleitung und Erläuterung der Makros finden Sie im README der Makro-Dokumentation.
-
%pyproject_buildrequiresGeneriert BuildRequires für das Paket. Wird im Abschnitt
%generate_buildrequiresderspec-Datei verwendet. Das Makro hat folgende Optionen:-
-R: Laufzeitabhängigkeiten nicht einschließen (z.B. wenn das Bau-Backend dies nicht unterstützt). -
-r: Laufzeitabhängigkeiten einschließen (dieses Flag ist nicht erforderlich und existiert nur aus Gründen der Abwärtskompatibilität; Laufzeitabhängigkeiten sind standardmäßig enthalten). -
-x EXTRA: Schließt die durch das angegebene extra definierten Abhängigkeiten ein.Kann nicht zusammen mit-Rverwendet werden. -
-g GRUPPE: Schließt die in der angegebenen Abhängigkeitsgruppe angegebenen Abhängigkeiten ein (PEP 735). -
-p: Liest Laufzeitabhängigkeiten aus der Tabelle[project]inpyproject.toml. Dies liest auch die [optionalen Abhängigkeiten] für die angegebenen extra. Kann nicht mit-Rverwendet werden. -
-t: Schließt Abhängigkeiten für die Standard-tox-Umgebung ein. Kann nicht zusammen mit-Rverwendet werden. -
-e ENV: Schließt Abhängigkeiten für die angegebene tox-Umgebung ein und speichert den NamenENVals%{toxenv}. Kann nicht mit-Rverwendet werden. Es können mehrere, durch Kommas getrennte Werte angegeben werden, zum Beispiel:%pyproject_buildrequires -e %{toxenv}-unit,%{toxenv}-integration -
Zusätzliche Argumente werden als Pfade zu
requirements.txtbehandelt, diezusätzlich zu diesen Abhängigkeiten hinzugefügt werden.
-
-
%pyproject_wheelBaut das Paket. Normalerweise ist dies das einzige Makro, das im Abschnitt
%buildbenötigt wird.Dieses Makro benötigt BuildRequires, die von
%pyproject_buildrequiresgeneriert werden.
-
%pyproject_installInstalliert das von
%pyproject_wheelerstellte Paket. Ruft%py3_shebang_fix %{_buildroot}%{_bindir}/*auf.Dieses Makro benötigt BuildRequires, die von
%pyproject_buildrequiresgeneriert werden.
-
%pyproject_save_files MODULNAME …Erstellt eine Liste der Dateien, die den angegebenen importierbaren Modulen entsprechen, und speichert sie als
%{pyproject_files}.Beachten Sie, dass die README-Datei nicht enthalten ist. Die LICENSE-Datei wird eingebunden, wenn sie in den Metadaten angegeben ist. Obwohl das Makro das Einbinden von ausführbaren Dateien und anderen Dateien (mittels des Flags
+auto) ermöglicht, darf diese Funktion unter Fedora NICHT verwendet werden.Der Parameter
MODULNAMEkann ein Glob-Muster sein, das spezifisch für Ihr Paket sein sollte. Um zu verhindern, dass die Shell die Globs erweitert, setzen Sie sie in'', z. B.%pyproject_save_files '*pytest'. Wie im Abschnitt Explizite Listen erwähnt, sind Ausdrücke wie%pyproject_save_files '*'nicht zulässig.Das Makro hat folgende Optionen:
-
-l: Gibt an, dass der Build bei fehlender Lizenz abgebrochen werden soll. Paketierern wird empfohlen, dieses Flag zu verwenden, wenn die%license-Dateinicht manuell in%filesaufgeführt ist, um ein versehentliches Verlieren der Datei in einer zukünftigen Version zu vermeiden. -
-L: Deaktiviert explizit die Prüfung auf eine fehlende Lizenzdatei. Wenn die Datei%licensemanuell in%filesaufgeführt ist, können Paketierer dieses Flag verwenden, um zukünftige Kompatibilität zu gewährleisten, falls das Verhalten von-lirgendwann zum Standard wird. -
-M: Keine Module auflisten. Wenn das Paket keine Python-Module enthält oder Sie die Module in%filesmanuell auflisten müssen, speichert diese Option nur die Nicht-Modul-Dateien (z.B. das Metadatenverzeichnis.dist-info). Diese Option kann nicht mitMODULNAMENkombiniert werden.
-
-
%{pyproject_files}Pfad zu der von
%pyproject_save_filesgeschriebenen Datei, der wie folgt verwendet werden soll:%files -n python3-DISTNAME -f %{pyproject_files}
Test-Makros
-
%toxTests mit
toxausführen.Dieses Makro benötigt BuildRequires, die mit der Option
-toder-evon das Makro%pyproject_buildrequiresgeneriert wurden.Verschiedene Umgebungen können mit
-eangegeben werden, beispielsweise:%check %tox %{?with_integration_tests:-e %{toxenv},%{toxenv}-integration}Flags für den
tox-Befehlkönnen nach--angegeben werden:%tox -- --parallel 0Zusätzliche Argumente für den Test-Runner können nach einem weiteren
--angegeben werden:%tox -- --parallel 0 -- --verbose tests/*
-
%{toxenv}Die vom Makro
%toxverwendeten tox-Umgebung(en). Mehrere Umgebungen werden durch Kommas getrennt. Sie können manuell oder mit%pyproject_buildrequires -t ENV1,ENV2außer Kraft gesetzt werden.
-
%{default_toxenv}(z.B.py39)Der systemweite Standardwert von
%{toxenv}.
-
%pytestFührt
%__pytestmit den für die Tests in%checkerforderlichen Umgebungsvariablen aus. Weitere Informationen finden Sie unter Tests ausführen.
-
%__pytest(/usr/bin/pytest)Der Befehl, den
%pytestverwendet. Kann neu definiert werden.
-
%py3_test_envvars(PATH=... PYTHONPATH=... PYTHONDONTWRITEBYTECODE=1 ...)Die von
%pytestund%toxverwendeten Umgebungsvariablen. Sie können verwendet werden, um benutzerdefinierte Test-Runner in%checkaufzurufen. Siehe Andere Test-Runner für Details.Eingeführt in Fedora Linux 38.
-
%py3_check_importImportiert alle bereitgestellten Module. Falls die Ausführung einer Upstream-Testsuite nicht möglich ist, verwenden Sie dieses Makro in
%check, um zu testen, ob öffentliche Python-Module importierbar sind.Folgende Argumente werden akzeptiert:
-
-f: Pfad zur Datei mit den qualifizierten Modulnamen (getrennt durch Zeilenumbrüche). Optional, kann mehrfach verwendet werden. -
-e: Glob-Muster zum Ausschließen übereinstimmender Modulnamen. Optional, kann mehrfach verwendet werden. -
-t: Falls gesetzt, werden nur Modulnamen der obersten Ebene importiert. -
Positionsargumente (durch Leerzeichen oder Kommas getrennt) geben den/die zu überprüfenden Modulnamen an.
Das Makro setzt verschiedene Umgebungsvariablen wie
PATHund`PYTHONPATH`, um sicherzustellen, dass die paketierten Versionen der Module importiert werden. -
-
%pyproject_check_importImportiert alle öffentlichen Module, die vom Makro
%pyproject_save_filesgefunden werden und deren Namen mit einem der angegebenenMODULNAME-Globs übereinstimmen.Dieses Makro muss mit
%pyproject_save_filesverwendet werden (verwenden Sie in anderen Fällen%py3_check_import).Das Makro akzeptiert
-e/-tsowie Positionsargumente für`%py3_check_import` oben.
Zusätzliche Makros
-
%pyproject_extras_subpkgErzeugt ein einfaches Teilpaket für ein Python-Extra. Weitere Informationen finden Sie unter Extras.
Dieses Makro muss mit
%pyproject_installverwendet werden (verwenden Sie in anderen Fällen%python_extras_subpkg).Erforderliche Argumente:
-
-n: Name des Basispakets (z.B.python3-requests) -
Positionsargumente (durch Leerzeichen oder Kommas getrennt): die zusätzlichen Namen.Bei Angabe mehrerer Namen werden mehrere Metapakete generiert.
Das Makro akzeptiert außerdem die Argumente
-i/-f/-Ffür`%python_extras_subpkg` weiter unten. Werden diese nicht angegeben, wird eine von%pyproject_installerstellte Dateiliste verwendet.In ähnlicher Weise werden die
-a/-A-Flags an%python_extras_subpkgübergeben.Dieses Makro generiert alle Teilpaketdefinitionsabschnitte (
%packageeinschließlichSummaryundRequiresdes Basispakets,%descriptionund standardmäßig%files). Daher kann es nicht mit benutzerdefinierten Provides/Obsoletes/Requires usw. erweitert werden. Dieses Makro ist nur für die häufigsten Anwendungsfälle gedacht. Für komplexere Anwendungsfälle erstellen Sie das Teilpaket manuell, wie im Abschnitt Extras beschrieben.Der Abschnitt
%filessteht am Ende. Hier können weitere Dateien hinzugefügt werden, die nur mit den zusätzlichen Funktionen sinnvoll sind und ohne die das Basispaket nicht fehlschlägt. Beispielsweise paketiert das folgende Makro die zusätzlichencli-Komponenten für das Projekta-cool-toolund fügt einena-cool-tool-Befehl hinzu:%pyproject_extras_subpkg -n a-cool-tool cli %{_bindir}/a-cool-toolAufgrund technischer Beschränkungen erzeugt das Makro niemals Abhängigkeiten zum architekturabhängigen
BASISPAKET%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}. Es fügt lediglichRequires: BASISPAKET = %t{?epoch:%{epoch}:}%{version}-%{release})hinzu, da ein Makro nicht zuverlässig erkennen kann, ob das Teilpaket architekturabhängig ist oder nicht. Bisher hat dies in der Praxis keine Probleme verursacht. -
-
%python_extras_subpkgErzeugt ein einfaches Teilpaket für ein Python-Extra. Weitere Informationen finden Sie unter Extras. Folgende Argumente werden akzeptiert:
-
-n: Name des Basispakets (z.B.python3-requests) -
-i: der Pfad (Glob)%files %ghostzum Verzeichnis.dist-info -
Positionsargumente (durch Leerzeichen oder Kommas getrennt) geben den/die zusätzlichen Namen an – es werden mehrere Metapakete generiert, wenn mehrere Namen angegeben werden.
-
-f: Relativer Pfad zur Dateiliste dieses Metapakets (die den Pfad%files %ghost(Glob-Muster) zum Metadatenverzeichnis enthalten sollte). Kann nicht zusammen mit-iund-Fverwendet werden. -
-F: Überspringt den Abschnitt %files vollständig (falls der Paketierer ihn manuell erstellen möchte). Kann nicht zusammen mit-iund-fverwendet werden. -
-a: FügtBuildArch: noarchin die Paketdefinition ein. Dies soll nur dann verwendet werden, wenn das Paket architekturabhängig ist, das an-nübergebene „Basis“-Paket jedoch nicht. -
-A: Deaktiviert explizit-a(hat momentan keine Auswirkung).
Wie bei
%pyproject_extras_subpkg:-
Dieses Makro generiert alle Teilpaketdefinitionsabschnitte, wobei lediglich
%filesanpassbar ist. Für komplexere Anwendungsfälle erstellen Sie das Teilpaket manuell, wie im Abschnitt Extras beschrieben. -
Es werden niemals Abhängigkeiten zum architekturabhängigen
BASISPAKET%{?_isa} =%{?epoch:%{epoch}:}%{version}-%{release}generiert.
-
Manuelle Erzeugung
Die folgenden Makros stehen für Fälle zur Verfügung, in denen die automatische Generierung deaktiviert ist. Sie können auch nützlich sein, um Dateien an ungewöhnlichen Speicherorten zu verarbeiten, an denen die Generatoren nicht suchen.
-
%pycached MODULNAME.pyGibt eine Python-Datei und die zugehörigen Dateien mit ihrem Bytecode-Cache auf. Weitere Informationen finden Sie unter „Quelldateien und Bytecode-Zwischenspeicher“.
-
%py_provides python3-MODULNAMEErzeugt
Providesfürpython3-MODULNAME,python3.X-MODULNAMEund`python-MODULNAME`. Siehe Automatische python- und python3.X-Provides für weitere Details.
-
%py_byte_compile INTERPRETER PFADByte-kompiliert eine Python-Datei in ein
__pycache__/*.pyc.Wenn das Argument
PATHein Verzeichnis ist, byte-kompiliert das Makro rekursiv alle*.py-Dateien im Verzeichnis. (Wenn Sie also Dateien kompilieren müssen, die nicht*.pyheißen, müssen Sie das Makro für jede Datei separat anwenden.)Der Parameter
INTERPRETERbestimmt die Dateiendung der kompilierten Datei und die im Dateinamen eingebettete magische Zahl. Diese müssen mit dem Interpreter übereinstimmen, der die Datei importiert. Normalerweise sollteINTERPRETERauf%{python3}gesetzt werden. Wenn Sie für einen anderen Interpreter kompilieren, verwenden Sie diesen und fügen Sie eineBuildRequires-Zeile hinzu.
-
%{py_dist_name PROJEKTNAME}Ein gegebener Projektname (z.B.
PyYAML) wird in das kanonische Format (z.B.pyyaml) konvertiert. Weitere Informationen finden Sie unter Kanonischer Projektname.
-
%{py3_dist PROJEKTNAME …}Bei Angabe eines oder mehrerer Projektnamen werden diese in das kanonische Format konvertiert und zu
python3dist(DISTNAME)evaluiertt. Dies ist nützlich beim Auflisten von Abhängigkeiten. Weitere Informationen finden Sie unter [Maschinenlesbare Provides].
Systemeinstellungen
Die folgenden Makros können für spezielle Anwendungsfälle neu definiert werden.
-
%{__python}(schlägt standardmäßig fehl, falls nicht neu definiert)Durch die Definition dieses Makros wird die Bedeutung aller „unversionierten“ Python-Makros wie z.B.
%{python}oder%{python_sitelib}festgelegt. Verwenden Sie diese Makros nicht, ohne%{__python}neu zu definieren.
-
%{__python3}(/usr/bin/python3)Der Python-3-Interpreter. Durch die Neudefinition dieses Makros werden alle
%{python3...}-Makros geändert, z.B.%{python3}oder%{python3_sitelib}.
-
%{python3_pkgversion}(3)Die distributionsweite Python-Version, d.h. die
3inpython3. Projekte, die auf Fedora aufbauen, definieren sie möglicherweise z.B. als3.9, um die parallele Installation mehrerer Python-Stacks zu ermöglichen. Pakete in Fedora DÜRFEN sie verwenden (z.B. in Paketnamen:python%{python3_pkgversion}-requests), DÜRFEN sie aber NICHT neu definieren.
Python-Versionsvergleich
Beim Vergleich von Python-Versionen (z.B. um zu fragen: Ist %{python3_version} größer als 3.8?) ist die Verwendung von naiven Ausdrücken wie %if %{python3_version} > 3.8 oder %if "%{python3_version}" > "3.8" nicht möglich, da der Vergleich alphabetisch auf Zeichenketten erfolgt. Daher ist zwar "3.10" < "3.8" korrekt (was jedoch nicht gewünscht ist).
Versionsliterale lassen sich explizit vergleichen, indem Sie das Präfix v verwenden, ähnlich den String-Präfixen in Python:
%if v"0%{?python3_version}" > v"3.8"
...
%endif
|
Um die Kompatibilität mit RPM-Versionen bis einschließlich 4.16 (EPEL 9) zu gewährleisten, kann`%{python3_version_nodots}` als Ganzzahl verglichen werden:
Dies funktioniert mit Python 3.10 (310 > 39), wird aber mit Python 4.0 (40 < 310) irgendwann nicht mehr funktionieren. |
Automatisierung deaktivieren
Die folgenden Makros können die Python-spezifische Automatisierung deaktivieren.
Falls nötig, sollten Sie sich an die Python SIG wenden.
-
%{?python_disable_dependency_generator}Deaktiviert die automatische Abhängigkeitsgenerierung. Weitere Informationen finden Sie unter[Automatisch erzeugte Abhängigkeiten].
-
%undefine __pythonname_providesDeaktiviert die automatische Generierung von versionierten/unversionierten Provides für Paketnamen, z.B.
python-FOOundpython3.9-FOOfürpython3-foo. Weitere Informationen finden Sie unter in Automatische python- und python3.X-Provides.
-
%undefine __pythondist_providesDeaktiviert die automatische Generierung maschinenlesbarer Provides, z.B.
python3dist(foo). Siehe [Maschinenlesbare Provides] für weitere Details.
-
%global _python_no_extras_requires 1Falls definiert, werden Automatische „Requires“ für Extras nicht erzeugt.
-
%global _python_dist_allow_version_zero 1Ab Fedora Linux 38 ist es nicht mehr möglich, ein Python-Paket mit der Versionsnummer 0 zu erstellen, um eine Versionswarnung ([_version_warning], ein versehentlicher Verlust der tatsächlichen Versionsinformationen) zu verhindern. Falls definiert, ermöglicht das Makro die Erstellung eines solchen Pakets.
Veraltete Makros
Die folgenden Makros sind veraltet. Informationen zur Verwendung einiger dieser Makros finden Sie in den Python-Paketbaurichtlinien der 201x-Ära.
Want to help? Learn how to contribute to Fedora Docs ›