Wie kann ich setup.py
eine Datei einschließen, die nicht Teil des Codes ist? (Insbesondere handelt es sich um eine Lizenzdatei, aber es kann auch eine andere Sache sein.)
Ich möchte den Speicherort der Datei steuern können. Im ursprünglichen Quellordner befindet sich die Datei im Stammverzeichnis des Pakets. (dh auf der gleichen Ebene wie die oberste __init__.py
.) Ich möchte, dass es genau dort bleibt, wenn das Paket installiert wird, unabhängig vom Betriebssystem. Wie mache ich das?
data_files = [('', ['lgpl2.1_license.txt',]),]
legt es im Python26-Ordner ab.Antworten:
Der wahrscheinlich beste Weg, dies zu tun, ist die Verwendung der
setuptools
package_data
Richtlinie. Dies bedeutet zwar die Verwendung vonsetuptools
(oderdistribute
) anstelle vondistutils
, aber dies ist ein sehr nahtloses "Upgrade".Hier ist ein vollständiges (aber nicht getestetes) Beispiel:
Beachten Sie die spezifischen Zeilen, die hier kritisch sind:
package_data
ist eindict
Paketname (leer = alle Pakete) zu einer Liste von Mustern (kann Globs enthalten). Wenn Sie beispielsweise nur Dateien in Ihrem Paket angeben möchten, können Sie dies auch tun:Die Lösung hier ist definitiv nicht , Ihre Nicht-
py
Dateien mit einer.py
Erweiterung umzubenennen .Siehe Ian Bicking Präsentation für weitere Informationen.
UPDATE: Ein weiterer [besserer] Ansatz
Ein anderer Ansatz, der gut funktioniert, wenn Sie nur den Inhalt der Quelldistribution (
sdist
) steuern und Dateien außerhalb des Pakets haben möchten (z. B. Verzeichnis der obersten Ebene), ist das Hinzufügen einerMANIFEST.in
Datei. Informationen zum Format dieser Datei finden Sie in der Python-Dokumentation .Seit ich diese Antwort geschrieben habe, habe ich festgestellt, dass die Verwendung
MANIFEST.in
in der Regel weniger frustrierend ist, um sicherzustellen, dass Ihre Quelldistribution (tar.gz
) die benötigten Dateien enthält.Wenn Sie beispielsweise das
requirements.txt
Verzeichnis der obersten Ebene einschließen möchten, schließen Sie das Datenverzeichnis der obersten Ebene rekursiv ein:Damit diese Dateien bei der Installation in den Ordner des Pakets in Site-Paketen kopiert werden können, müssen Sie
include_package_data=True
diesetup()
Funktion bereitstellen . Weitere Informationen finden Sie unter Hinzufügen von Nicht-Code-Dateien .quelle
Um das zu erreichen, was Sie beschreiben, sind zwei Schritte erforderlich ...
Schritt 1: Um die Datei zum Quell-Tarball hinzuzufügen, fügen Sie sie dem MANIFEST hinzu
Erstellen Sie eine MANIFEST- Vorlage in dem Ordner, der setup.py enthält
Das MANIFEST ist im Grunde eine Textdatei mit einer Liste aller Dateien, die im Quell-Tarball enthalten sein werden.
So sehen die MANIFEST für mein Projekt aus:
Hinweis: Während Sdist hat einige Dateien automatisch hinzufügen , ziehe ich sie explizit angeben , um sicher zu sein , anstatt die Vorhersage , was es tut und nicht tut.
Schritt 2: Um die Datendatei im Quellordner zu installieren, ändern Sie setup.py
Da Sie dem Quellinstallationsordner eine Datendatei (LICENSE.txt) hinzufügen möchten, müssen Sie den Dateninstallationspfad an den Quellinstallationspfad anpassen. Dies ist erforderlich, da Datendateien standardmäßig an einem anderen Speicherort als Quelldateien installiert werden.
So ändern Sie das Dateninstallationsverzeichnis so, dass es mit dem Quellinstallationsverzeichnis übereinstimmt ...
Ziehen Sie die Installationsverzeichnisinformationen von distutils mit:
Ändern Sie das Dateninstallationsverzeichnis so, dass es mit dem Quellinstallationsverzeichnis übereinstimmt:
Fügen Sie die Datendatei und den Speicherort zu setup () hinzu:
Hinweis: Mit den obigen Schritten sollten Sie genau das erreichen, was Sie standardmäßig beschrieben haben, ohne dass Erweiterungsbibliotheken erforderlich sind.
quelle
package_data
funktioniert dies nicht, wenn sich die Datei nicht im Paket befindet.Erstellen Sie
MANIFEST.in
im Projektstamm mitrecursive-include
dem gewünschten Verzeichnis oderinclude
mit dem Dateinamen.Dokumentation finden Sie hier
quelle
Ich wollte einen Kommentar zu einer der Fragen posten, aber ich habe nicht genug Ruf, um das zu tun>.>
Folgendes hat bei mir funktioniert (nachdem ich auf die Dokumente verwiesen hatte):
Die letzte Zeile war seltsamerweise auch für mich von entscheidender Bedeutung (Sie können dieses Schlüsselwortargument auch weglassen - es funktioniert genauso).
Dadurch werden alle Textdateien in Ihr oberstes oder Stammverzeichnis kopiert (eine Ebene höher als das Paket, das
mypkg
Sie verteilen möchten).Hoffe das hilft!
quelle
MANIFEST.in
, das funktionierte für mich. Die letzte Zeile war auch für mich entscheidend. Meine Zeilen wareninclude_package_data=False, package_data={ "": ["../CHANGELOG.md"] },
Schritt 1: Erstellen Sie
MANIFEST.in
mit setup.py eine Datei im selben OrdnerSchritt 2: Geben Sie den relativen Pfad zu den Dateien an, die Sie hinzufügen möchten
MANIFEST.in
Schritt 3: Stellen Sie
include_package_data=True
diesetup()
Funktion ein, um diese Dateien in das Site-Paket zu kopierenReferenz ist hier.
quelle
Es ist 2019, und hier ist, was funktioniert - trotz Ratschlägen hier und da wird das, was ich im Internet zur Hälfte dokumentiert gefunden habe
setuptools_scm
, als Option an übergebensetuptools.setup
. Dies schließt alle Datendateien ein, die auf Ihrem VCS versioniert sind, sei es git oder eine andere, in das Radpaket, und führt eine "pip install" aus dem git-Repository durch, um diese Dateien mitzubringen.Also habe ich gerade diese beiden Zeilen zum Setup-Aufruf auf "setup.py" hinzugefügt. Keine zusätzlichen Installationen oder Importe erforderlich:
Sie müssen package_data nicht manuell oder in einer MANIFEST.in-Datei auflisten - wenn es versioniert ist, ist es im Paket enthalten. In den Dokumenten zu "setuptools_scm" wird der Schwerpunkt auf die Erstellung einer Versionsnummer aus der Festschreibungsposition gelegt und der wirklich wichtige Teil beim Hinzufügen der Datendateien ignoriert. (Es ist mir egal, ob meine Zwischenraddatei "* 0.2.2.dev45 + g3495a1f" heißt oder die von mir eingegebene fest codierte Versionsnummer "0.3.0dev0" verwendet - aber wichtige Dateien für das Programm belässt Arbeit dahinter ist etwas wichtig)
quelle
In setup.py unter setup (:
quelle
package_data
, hat keinen Einfluss darauf, wassetup.py install
funktioniert, es sei denn, Sie ändern den Installationsbefehl selbst. Es sei denn, diese Dateien befinden sich im Paketverzeichnis, was Sie normalerweise vermeiden möchten.Hier ist eine einfachere Antwort, die für mich funktioniert hat.
Erstens sind gemäß dem obigen Kommentar eines Python-Entwicklers setuptools nicht erforderlich:
Das ist großartig, denn wenn Sie eine Setuptool-Anforderung an Ihr Paket stellen, müssen Sie es auch installieren. Zusamenfassend:
quelle
pkgame
nicht existiertIch wollte nur etwas nachverfolgen, das ich bei der Arbeit mit Python 2.7 unter Centos 6 gefunden habe. Das Hinzufügen der Paketdaten oder Datendateien wie oben erwähnt hat bei mir nicht funktioniert. Ich habe eine MANIFEST.IN mit den gewünschten Dateien hinzugefügt, die die Nicht-Python-Dateien in den Tarball einfügt, sie aber nicht über RPM auf dem Zielcomputer installiert.
Am Ende konnte ich die Dateien mithilfe der "Optionen" in den Setup / Setuptools in meine Lösung aufnehmen. Mit den Optionsdateien können Sie verschiedene Abschnitte der Spezifikationsdatei aus setup.py ändern. Wie folgt.
Datei - MANIFEST.in:
Datei - Datei mit Installationsbefehlen:
quelle
Umgehung einer Problemumgehung: Ich habe meine
lgpl2.1_license.txt
in umbenanntlgpl2.1_license.txt.py
und den Text in dreifache Anführungszeichen gesetzt. Jetzt muss ich weder diedata_files
Option verwenden noch absolute Pfade angeben. Ich weiß, es ist hässlich, es zu einem Python-Modul zu machen, aber ich halte es für weniger hässlich als die Angabe absoluter Pfade.quelle