Hier ist mein abgespecktes setup.py-Skript, bei dem Nicht-Code-Inhalte entfernt wurden:
#!/usr/bin/env python
from distutils.core import setup
from whyteboard.misc import meta
setup(
name = 'Whyteboard',
version = meta.version,
packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub',
'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'],
py_modules = ['whyteboard'],
scripts = ['whyteboard.py'],
)
MANIFEST.in:
include *.txt
include whyteboard-help/*.*
recursive-include locale *.mo
recursive-include images *.png
Wenn ich "python setup.py install sdist" ausführe, erhalte ich eine schöne .tar.gz mit einem Stammordner "whyteboard-0.41", in dem sich meine Ordner locale / images / und whyteboard-help / befinden. Dies hat auch mein whyteboard.py-Skript, das mein Programm aus dem whyteboard-Quellpaket heraus startet.
So:
whyteboard/
├── locale/
├── images
├── whyteboard-help/
├── whyteboard/
│ ├── __init__.py
│ └── other packages etc
├── whyteboard.py
├── README
├── setup.py
└── CHANGELOG
Dies spiegelt die Quelle meines Programms wider, ist, wie alles sein sollte und ist korrekt.
Wenn ich jedoch "python setup.py install" ausführe, wird keine meiner Datendateien geschrieben - nur das Quellpaket "whyteboard" und die Datei whyteboard.py werden in /usr/local/lib/python2.6/dist-packages/ abgelegt. .
Im Idealfall möchte ich, dass dieselbe Verzeichnisstruktur wie die in der Datei .tar.gz generierte in dist-Paketen erstellt wird, da mein Programm auf diese Weise erwartet, nach seinen Ressourcen zu suchen.
Wie kann ich "installieren", um diese Verzeichnisstruktur zu erstellen? Soweit ich das beurteilen kann, scheint es meine Manifestdatei zu ignorieren.
MANIFEST.in
teilt Distutils mit, welche Dateien in die Quelldistribution aufgenommen werden sollen, hat jedoch keinen direkten Einfluss darauf, welche Dateien installiert werden. Dazu müssen Sie die entsprechenden Dateien in diesetup.py
Datei aufnehmen, in der Regel entweder als Paketdaten oder als zusätzliche Dateien .quelle
Ich konnte nicht herausfinden, warum meine
MANIFEST.in
Datei beim Ausführen ignoriert wurdepython setup.py install
- es stellt sich heraus, dassinclude_package_data=True
das Problem gelöst ist. Diepackage_data
Option ist eigentlich nicht erforderlich.quelle
include_package_data=True
ist nicht Standardwert?Unter Python 2.6.1 unter Mac OS X hatte ich absolut kein Glück, außer mit dem Parameter data_files in setup.py. Alles mit MANIFEST.in führte einfach dazu, dass Dateien im dist-Paket enthalten waren, aber nie installiert wurden. Ich habe einige andere Pakete überprüft und sie haben tatsächlich data_files verwendet, um zusätzliche Dateien anzugeben.
Ich habe eine kurze Funktion erstellt, mit deren Hilfe alle Dateien aus einem Verzeichnisbaum in der Liste aufgelistet werden können
(target_dir, [file list]) Format, das data_files erwartet:
Jetzt kann ich dies einfach in meinem Setup-Aufruf aufrufen:
Und alles in diesen Bäumen wird installiert.
quelle
Sie sollten Setuptools verwenden:
Dies verwendet nicht die MANIFEST-Datei, um den Job auszuführen, sondern enthält alle erforderlichen Dateien.
quelle
package_data
Wörterbuch aufgelisteten Glade-Dateien erst nach dem Hinzufügen an der richtigen Stelle angezeigt werdeninclude_package_data=Tru
.Minimales veröffentlichtes ausführbares Beispiel
Schlüssel zum Mitnehmen: hat nur
MANIFEST.in
für mich funktioniert,package_data
nicht.Getestet unter Ubuntu 19.10, Python 3.7.5, Wheel == 0.32.3, Setuptools == 41.1.0, Twine == 3.1.1.
Wie Endbenutzer das Paket unter https://pypi.org/project/python-sample-package-with-data/ verwenden :
Erwartete Ausgabe:
Wie Betreuer es veröffentlichen:
Die eigentlichen Dateien:
MANIFEST.in
Python-Beispiel-Paket-mit-Daten
python_sample_package_with_data / __ init__.py
python_sample_package_with_data / mydata.txt
setup.py
Literaturverzeichnis:
quelle