Stellen Sie sich vor, Sie möchten eine nicht triviale Desktop-Anwendung für Endbenutzer (nicht für das Web) in Python entwickeln. Wie lässt sich die Ordnerhierarchie des Projekts am besten strukturieren?
Wünschenswerte Funktionen sind einfache Wartung, IDE-Freundlichkeit, Eignung für das Verzweigen / Zusammenführen der Quellcodeverwaltung und die einfache Generierung von Installationspaketen.
Bestimmtes:
- Woher nimmst du die Quelle?
- Wo platzieren Sie Anwendungsstart-Skripte?
- Wo platzieren Sie die IDE-Projekt-Cruft?
- Wo platzieren Sie die Einheits- / Abnahmetests?
- Wo legen Sie Nicht-Python-Daten wie Konfigurationsdateien ab?
- Wo platzieren Sie Nicht-Python-Quellen wie C ++ für binäre pyd / so-Erweiterungsmodule?
Nach Jean-Paul Calderones Dateisystemstruktur eines Python-Projekts :
quelle
Project/project/
? Ah, der zweite ist der Paketname.../
in einer include-Anweisung erlaubt )pip install -e /path/to/Project
)-e
Flag, das das Paket als bearbeitbares Paket installiert, dh als Links zum eigentlichen Projektordner installiert. Die ausführbare Datei kann dann nurimport project
noch Zugriff auf das Modul haben.Dieser Blog-Beitrag von Jean-Paul Calderone wird häufig als Antwort in #python on Freenode gegeben.
quelle
Schauen Sie sich Open Sourcing eines Python-Projekts richtig an .
Lassen Sie mich den Projektlayout- Teil dieses ausgezeichneten Artikels extrahieren:
quelle
Makefile
das gleiche Niveau wiesetup.py
? Wenn ich also verstehe, dass Siemake env
das Erstellen eines neuenvenv
und das Installieren der Pakete korrekt automatisieren ...?Die "Python Packaging Authority" hat ein Beispielprojekt:
https://github.com/pypa/sampleproject
Es handelt sich um ein Beispielprojekt, das als Hilfe für das Tutorial zum Verpacken und Verteilen von Projekten im Python Packaging-Benutzerhandbuch dient.
quelle
root/src/*
Struktur: github.com/pypa/sampleproject/commit/…Versuchen Sie, das Projekt mit der Vorlage python_boilerplate zu starten . Es folgt weitgehend den Best Practices (z. B. die hier ), ist jedoch besser geeignet, wenn Sie bereit sind, Ihr Projekt irgendwann in mehr als ein Ei aufzuteilen (und glauben Sie mir, mit etwas anderem als den einfachsten Projekten werden Sie es tun In der Regel müssen Sie eine lokal geänderte Version der Bibliothek eines anderen Benutzers verwenden.
Woher nimmst du die Quelle?
PROJECT_ROOT/src/<egg_name>
.Wo platzieren Sie Anwendungsstart-Skripte?
entry_point
in einem der Eier registriert zu haben .Wo platzieren Sie die IDE-Projekt-Cruft?
PROJECT_ROOT/.<something>
der Wurzel des Projekts, und das ist in Ordnung.Wo platzieren Sie die Einheits- / Abnahmetests?
PROJECT_ROOT/src/<egg_name>/tests
Verzeichnis gespeichert sind. Ich persönlich bevorzuge es, siepy.test
zu betreiben.Wo legen Sie Nicht-Python-Daten wie Konfigurationsdateien ab?
pkg_resources
Paket vonsetuptools
oder seit Python 3.7 über dasimportlib.resources
Modul aus der Standardbibliothek verwendet werden.PROJECT_ROOT/config
. Für die Bereitstellung gibt es verschiedene Optionen. Unter Windows kann man verwenden%APP_DATA%/<app-name>/config
, unter Linux/etc/<app-name>
oder/opt/<app-name>/config
.PROJECT_ROOT/var
während der Entwicklung und/var
während der Linux-Bereitstellung beizubehalten.PROJECT_ROOT/src/<egg_name>/native
Die Dokumentation wird normalerweise in
PROJECT_ROOT/doc
oderPROJECT_ROOT/src/<egg_name>/doc
(dies hängt davon ab, ob Sie einige der Eier als separate große Projekte betrachten). Einige zusätzliche Konfigurationen befinden sich in Dateien wiePROJECT_ROOT/buildout.cfg
undPROJECT_ROOT/setup.cfg
.quelle
base_data_location
Variable, aber wie stellen Sie sie richtig ein?Nach meiner Erfahrung ist es nur eine Frage der Iteration. Platzieren Sie Ihre Daten und Ihren Code überall dort, wo Sie glauben, dass sie sich befinden. Die Chancen stehen gut, dass Sie sich sowieso irren. Aber sobald Sie eine bessere Vorstellung davon haben, wie sich die Dinge entwickeln werden, sind Sie in einer viel besseren Position, um solche Vermutungen anzustellen.
In Bezug auf Erweiterungsquellen haben wir ein Code-Verzeichnis unter Trunk, das ein Verzeichnis für Python und ein Verzeichnis für verschiedene andere Sprachen enthält. Persönlich bin ich eher geneigt, beim nächsten Mal einen Erweiterungscode in ein eigenes Repository zu stellen.
Nachdem dies gesagt ist, kehre ich zu meinem Ausgangspunkt zurück: Machen Sie keine zu große Sache daraus. Stellen Sie es an einen Ort, der für Sie zu funktionieren scheint. Wenn Sie etwas finden, das nicht funktioniert, kann (und sollte) es geändert werden.
quelle
Nicht-Python-Daten werden am besten in Ihren Python-Modulen mithilfe der
package_data
Unterstützung in setuptools gebündelt . Ich empfehle dringend, Namespace-Pakete zu verwenden, um gemeinsam genutzte Namespaces zu erstellen, die von mehreren Projekten verwendet werden können - ähnlich wie bei der Java-Konvention, Pakete einzufügencom.yourcompany.yourproject
(und einen gemeinsam genutztencom.yourcompany.utils
Namespace zu haben ).Beim erneuten Verzweigen und Zusammenführen werden Zusammenführungen auch durch Umbenennen verarbeitet, wenn Sie ein ausreichend gutes Versionsverwaltungssystem verwenden. Basar ist besonders gut darin.
Im Gegensatz zu einigen anderen Antworten hier bin ich +1 für ein
src
Verzeichnis der obersten Ebene (mitdoc
undtest
Verzeichnissen daneben). Spezifische Konventionen für Dokumentationsverzeichnisbäume variieren je nach Verwendung. Sphinx hat zum Beispiel seine eigenen Konventionen, die sein Schnellstart-Tool unterstützt.Bitte nutzen Sie setuptools und pkg_resources. Dies erleichtert anderen Projekten das Verlassen auf bestimmte Versionen Ihres Codes erheblich (und das gleichzeitige Installieren mehrerer Versionen mit verschiedenen Nicht-Code-Dateien, wenn Sie diese verwenden
package_data
).quelle