Ich benutze Setuptools, um mein Python-Paket zu verteilen. Jetzt muss ich zusätzliche Datendateien verteilen.
Nach dem, was ich aus der setuptools-Dokumentation zusammengetragen habe, muss ich meine Datendateien im Paketverzeichnis haben. Ich möchte meine Datendateien jedoch lieber in einem Unterverzeichnis im Stammverzeichnis haben.
Was ich vermeiden möchte:
/ #root
|- src/
| |- mypackage/
| | |- data/
| | | |- resource1
| | | |- [...]
| | |- __init__.py
| | |- [...]
|- setup.py
Was ich stattdessen gerne hätte:
/ #root
|- data/
| |- resource1
| |- [...]
|- src/
| |- mypackage/
| | |- __init__.py
| | |- [...]
|- setup.py
Ich fühle mich einfach nicht wohl mit so vielen Unterverzeichnissen, wenn es nicht wesentlich ist. Ich finde keinen Grund, warum ich die Dateien im Paketverzeichnis ablegen muss. Es ist meiner Meinung nach auch umständlich, mit so vielen verschachtelten Unterverzeichnissen zu arbeiten. Oder gibt es einen guten Grund, der diese Einschränkung rechtfertigen würde?
quelle
__init__.py
Datei hinzufügen , auch wenn diese Datei leer ist. Sie können also ein Datenverzeichnis mit einer leeren__init__.py
Datei getrennt halten , damit es wie ein Paket aussieht. Das sollte verhindern, dass grep aus Ihrem Quellbaum sie aufnimmt, aber es wird von Python und seinen Build-Tools weiterhin als Paket erkannt.Antworten:
Option 1: Als Paketdaten installieren
Der Hauptvorteil des Platzierens von Datendateien im Stammverzeichnis Ihres Python-Pakets besteht darin, dass Sie sich keine Gedanken darüber machen müssen, wo sich die Dateien auf dem System eines Benutzers befinden, z. B. Windows, Mac, Linux, eine mobile Plattform oder in einem Ei. Sie können das Verzeichnis immer
data
relativ zu Ihrem Python-Paketstamm finden, unabhängig davon, wo oder wie es installiert ist.Zum Beispiel, wenn ich ein Projektlayout wie dieses habe:
Sie können eine Funktion hinzufügen
__init__.py
, um einen absoluten Pfad zu einer Datendatei zu finden:Ausgänge:
Nachdem das Projekt als Ei installiert wurde,
data
ändert sich der Pfad zu , aber der Code muss nicht geändert werden:Option 2: Installation an einem festen Ort
Die Alternative wäre, Ihre Daten außerhalb des Python-Pakets zu platzieren und dann entweder:
data
über eine Konfigurationsdatei, Befehlszeilenargumente oder übergebenDies ist weitaus weniger wünschenswert, wenn Sie Ihr Projekt verteilen möchten. Wenn Sie dies wirklich tun möchten, können Sie Ihre
data
Datei auf dem Zielsystem installieren, wo immer Sie möchten, indem Sie das Ziel für jede Dateigruppe angeben, indem Sie eine Liste mit Tupeln übergeben:Aktualisiert : Beispiel einer Shell-Funktion zum rekursiven Grepen von Python-Dateien:
quelle
data_files
. Sie können auch einen Shell-Alias für grep erstellen, um Nicht-Python-Dateien zu ignorierengrep_py
.Ich glaube, ich habe einen guten Kompromiss gefunden, mit dem Sie die folgende Struktur beibehalten können:
Sie sollten Daten als package_data installieren, um die in samplebias answer beschriebenen Probleme zu vermeiden. Um jedoch die Dateistruktur beizubehalten, sollten Sie Ihre setup.py hinzufügen:
Auf diese Weise erstellen wir "just in time" die entsprechende Struktur und pflegen unseren Quellbaum organisiert.
Um auf solche Datendateien in Ihrem Code zuzugreifen, verwenden Sie "einfach":
data = resource_filename(Requirement.parse("main_package"), 'mypackage/data')
Ich mag es immer noch nicht, 'mypackage' im Code angeben zu müssen, da die Daten mit diesem Modul nicht unbedingt etwas zu tun haben könnten, aber ich denke, es ist ein guter Kompromiss.
quelle
Ich denke, dass Sie setup () grundsätzlich alles als Argument * data_files * geben können .
quelle