Bei Verwendung von setuptools / Distribute kann ich das Installationsprogramm nicht dazu bringen, package_data
Dateien abzurufen . Alles, was ich gelesen habe, besagt, dass das Folgende der richtige Weg ist, dies zu tun. Kann jemand bitte beraten?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
zip_safe=False,
install_requires=['distribute'],
)
Wo myapp/data/
ist der Speicherort der Datendateien?
python
setuptools
distribute
cmcginty
quelle
quelle
data_files
das Problem gelöst. Dies ist jedoch fehleranfällig und fühlt sich für mich nicht "richtig" an. Kann jemand überprüfen, ob es wirklich notwendig ist , die Konfiguration in beidenpackage_data
und zu duplizierendata_files
?pyproject.toml
. Keinesetup.py
Datei erforderlich.Antworten:
Mir ist klar, dass dies eine alte Frage ist, aber für Leute, die sich über Google hierher zurechtfinden: Es
package_data
ist eine einfache , schmutzige Lüge . Es wird nur beim Erstellen von Binärpaketen (python setup.py bdist ...
) verwendet, nicht jedoch beim Erstellen von Quellpaketen (python setup.py sdist ...
). Dies ist natürlich lächerlich - man würde erwarten, dass das Erstellen einer Quelldistribution zu einer Sammlung von Dateien führen würde, die an eine andere Person gesendet werden könnten, um die Binärdistribution zu erstellen.In jedem Fall
MANIFEST.in
funktioniert die Verwendung sowohl für Binär- als auch für Quellverteilungen.quelle
package_data
funktioniert fürbdist
und nichtsdist
. Allerdings ,MANIFEST.in
arbeitet fürsdist
, aber nicht fürbdist
! Aus diesem Grund haben die beste ich in der Lage gewesen , mit zu kommen ist sowohl aufzunehmenpackage_data
undMANIFEST.in
um beide aufzunehmenbdist
undsdist
.MANIFEST.in
für Dateien, die Sie nicht installieren möchten , z. B. Dokumentation, undpackage_data
für Dateien, die Sie verwenden und die keinen Python-Code enthalten (z. B. ein Bild oder eine Vorlage).MANIFEST.in
als auch einschließenpackage_data
. Es scheint, dass diesMANIFEST.in
steuert, was in der Distribution enthalten ist, und package_data steuert, was anschließend während der Installation in das Verzeichnis site_packages kopiert wird. VerwirrenderweiseMANIFEST.in
beziehen sich die Pfade in relativ zum Speicherort von setup.py undpackage_data
relativ zum Stammverzeichnis der einzelnen Pakete (z. B. Module).package_data
nur dann automatisch in die ZIP- Datei aufgenommen , wenn keine MANIFEST.in-Datei vorhanden ist und wenn Sie 2.7+ verwenden.Ich hatte gerade das gleiche Problem. Die Lösung war einfach zu entfernen
include_package_data=True
.Nachdem ich hier gelesen hatte , wurde mir klar, dass das
include_package_data
Ziel darin besteht, Dateien aus der Versionskontrolle einzuschließen , anstatt nur "Paketdaten einzuschließen", wie der Name schon sagt. Aus den Dokumenten:Das Herausnehmen dieses Arguments hat es behoben, weshalb es zufällig auch funktioniert hat, als Sie zu distutils gewechselt sind, da es dieses Argument nicht akzeptiert.
quelle
include_package_data=True
Eintrag einzuschließen. Die einzige Lösung für mich besteht darin, einen Eintrag in Manifest hinzuzufügen, wie oben vorgeschlagen. Wohlgemerkt, ich habe Setuptools verwendet. Vielleicht funktioniert Ihre Version mit 'Distribute'?include_package_data
Problem löst , ist weiter im Originaltext - Wenn die Setuptools spezifische Verwendunginclude_package_data
Argumente angegebenen Dateienpackage_data
nicht automatisch zu dem Manifest hinzugefügt werden , wenn sie in der aufgelistetenMANIFEST.in
Datei.package_data
eine nicht leere Liste festgelegt und angegeben wirdinclude_package_data=False
? Und warum sollten Sie Dateien inMANIFEST.in
und zweimal angeben müssenpackage_data
?Das Befolgen der Empfehlung von @Joe, die
include_package_data=True
Leitung zu entfernen , hat auch bei mir funktioniert.Um etwas näher darauf einzugehen, habe ich keine
MANIFEST.in
Datei. Ich benutze Git und nicht CVS.Das Repository nimmt folgende Form an:
setup.py
::Ich laufe
python setup.py sdist
für eine Quelldistribution (habe keine Binärdatei ausprobiert).Und wenn ich mich in einer brandneuen virtuellen Umgebung befinde, habe ich eine
myproject-4.19.tar.gz
, Datei und verwende sieUnd abgesehen davon, dass alles in meiner virtuellen Umgebung installiert wird
site-packages
, werden diese speziellen Datendateien in/opt/local/myproject/data
und installiert/opt/local/myproject/etc
.quelle
include_package_data=True
arbeitete für mich.Wenn Sie git verwenden, denken Sie daran,
setuptools-git
in aufzunehmeninstall_requires
. Weit weniger langweilig als einenManifest
oder alle Pfade einzuschließenpackage_data
(in meinem Fall ist es eine Django-App mit allen Arten von Statik)(fügte den Kommentar ein, den ich gemacht habe, wie k3-rnc erwähnte, ist es tatsächlich hilfreich, wie es ist)
quelle
Update : Diese Antwort ist alt und die Informationen sind nicht mehr gültig. Alle setup.py-Konfigurationen sollten verwenden
import setuptools
. Ich habe eine vollständigere Antwort unter https://stackoverflow.com/a/49501350/64313 hinzugefügtIch habe das gelöst, indem ich zu Distutils gewechselt bin. Es sieht so aus, als ob Distribute veraltet und / oder defekt ist.
quelle
include_package_data=True
nicht geehrt wurde. Mit dieser Einstellung benötigen Sie also nur MANIFEST.in - Sie müssen Ihre Dateiliste in derpackage_data
Einstellung nicht duplizieren .Alte Frage und doch ... Paketverwaltung von Python lässt wirklich zu wünschen übrig. Ich hatte also den Anwendungsfall, Pip lokal in einem bestimmten Verzeichnis zu installieren, und war überrascht, dass sowohl die Pfade package_data als auch data_files nicht funktionierten. Ich war nicht daran interessiert, dem Repo noch eine weitere Datei hinzuzufügen, also nutzte ich schließlich die Option data_files und setup.py --install-data; etwas wie das
quelle
Das Verschieben des Ordners mit den Paketdaten in den Modulordner löste das Problem für mich.
Siehe diese Frage: MANIFEST.in wird bei "python setup.py install" ignoriert - keine Datendateien installiert?
quelle
Ich hatte ein paar Tage lang das gleiche Problem, aber selbst dieser Thread konnte mir nicht helfen, da alles verwirrend war. Also habe ich meine Recherchen durchgeführt und die folgende Lösung gefunden:
Die vollständige Antwort auf den anderen Stackoverflow finden Sie hier
quelle
Entfernen Sie einfach die Zeile:
von Ihrem Setup-Skript, und es wird gut funktionieren. (Gerade jetzt mit den neuesten Setuptools getestet.)
quelle
sdist
als auchbdist_wheel
, hast du überprüft warum?sdist
ignoriert,package_data
wenn dies eingestellt ist.Verwenden von setup.cfg (setuptools ≥ 30.3.0)
Ab setuptools 30.3.0 (veröffentlicht am 08.12.2016) können Sie Ihre
setup.py
sehr klein halten und die Konfiguration in einesetup.cfg
Datei verschieben. Mit diesem Ansatz können Sie Ihre Paketdaten in einen[options.package_data]
Abschnitt einfügen:In diesem Fall kann Ihr
setup.py
so kurz sein wie:Weitere Informationen finden Sie unter Konfigurieren des Setups mithilfe der Dateien setup.cfg .
Es ist die Rede von einer Abwertung
setup.cfg
zugunsten derpyproject.toml
in PEP 518 vorgeschlagenen , aber diese ist ab dem 21.02.2020 noch vorläufig.quelle
pip install
.pip install
, dass für eine ausreichend moderne Version von Pip zuerst ein Rad gebaut und dann installiert wird. Für viele Benutzer wird dieser Ansatz jedoch stillschweigend keine Paketdaten enthalten. Einzelheiten dazu finden Sie in der akzeptierten Antwort und den Kommentaren darunter. Die Verwendung von asetup.cfg
ist wirklich nur eine andere Art zu schreiben, was das OP bereitssetup.py
in der Frage getan hat (indem daspackage_data
Schlüsselwortargument im Aufruf an übergeben wurdesetup
), daher denke ich nicht, dass dies als Antwort auf diese Frage besonders hilfreich ist . Es geht überhaupt nicht um das zugrunde liegende Problem.