Wo finde ich eine Referenz/Sample für ein gut strukturiertes Python-Projekt:
Die wichtigsten Punkte:
- Alle Module in einzelnen Verzeichnissen gruppiert (für spätere dist über setup)
- Verzeichnis der unittests (Teil von dist?, wie genau werden die Test-Module die Klassen einbinden?)
- Dokuerzeugung (pydoc, doxygen, ...)? Empfehlung?
- Apps (lokale Nutzung der Sub-Module (Suchpfade!), sowie die Verwendung über installierte Module (teilweise oder alle)
Anmerkung dazu:
Da python selbst die perfekte Umgebung mitbringt, um über Templates ganze Projektstarts aufzusetzen, Frage ich mich, gibt's sowas evtl. schon?
Referenz-Sample Python 3.X
Puh, da sollte fast jedes grössere Projekt herhalten können. Ich schmeisse mal SQLAlchemy in den Ring: https://bitbucket.org/zzzeek/sqlalchemy/src
- lightos
- User
- Beiträge: 39
- Registriert: Montag 12. Dezember 2011, 19:39
- Wohnort: Raum Bruchsal
- Kontaktdaten:
SQLAlchemy verwende ich selbst auch.
Ist aber schon etwas größeres.
Was mir fehlt, ist eine gute Basis-Struktur die dann mitwachsen kann. Könnte man sich natürlich aus SQLAlchemy anlehnen und Teile extrahieren.
Das ist aber nicht unbedingt verständlich für Anfänger und sieht aufwändig aus.
Sinnvoll wäre hier besser erstmal ein Basis-Projekt mit den wesentlichen Strukturen und Elementen, kein Mammut-Projekt.
Ist aber schon etwas größeres.
Was mir fehlt, ist eine gute Basis-Struktur die dann mitwachsen kann. Könnte man sich natürlich aus SQLAlchemy anlehnen und Teile extrahieren.
Das ist aber nicht unbedingt verständlich für Anfänger und sieht aufwändig aus.
Sinnvoll wäre hier besser erstmal ein Basis-Projekt mit den wesentlichen Strukturen und Elementen, kein Mammut-Projekt.
In der Regel hat man eine Grundstruktur die in etwa so aussieht:
Für Versionsverwaltung und andere Tools kommen möglicherweise noch einige Konfigurationsdateien hinzu.
Alle Module/Packages sollten unter dem project Package zu finden sein. Die Tests importieren was auch immer sie testen genauso wie anderer Code auch. Für die Dokumentation solltest du Sphinx benutzen, weder gibt es dazu eine ernstzunehmende Alternative noch wird dein Projekt jemand ernstnehmen falls du es nicht nutzt. Was genau die mit Apps meinst solltest du nochmal erläutern.
Zum generieren von sowas gibt es cookiecutter.
Wenn du bisher noch nirgendswo mitgearbeitet hast oder irgendwelche Projekte erstellst hast, gibt es noch eine Reihe von Tools die du kennen solltest:
pytest für Tests, bietet wesentlich mehr Features als unittest, macht schreiben von Tests deutlich angenehmer und ist stark erweiterbar, insbesondere pytest-xdist ist hier erwähnenswert was es dir erlaubt Tests parallel auszuführen oder auf anderen Maschinen über SSH.
virtualenv um Abhängigkeiten für unterschiedliche Projekte zu isolieren, Versionskonflikte zwischen unterschiedlichen Projekten zu vermeiden, das System sauber zu halten und sich in der Entwicklung befindende Projekte zu testen.
tox bietet sich an um Tests in unterschiedlichen virtualenvs auszuführen, das ist praktisch um die Tests auf unterschiedlichen Interpretern, mit unterschiedlichen Abhängigkeiten und Abhängigkeiten in unterschiedlichen Versionen zu testen. Außerdem lässt sich mit Tox Dokumentation gut testen oder automatisierte Coding Style Tests ausführen.
Für letzteres wäre übrigens noch pyflakes empfehlenswert. Für brauchbare Editoren gibt es Plug-ins mit denen sich Pyflakes auch integrieren lässt.
Da du ja hoffentlich git und zumindest für Open Source Projekte wahrscheinlich Github nutzt, solltest du auch Travis kennen. Damit kannst du Tests automatisiert mit jedem Commit ausführen lassen, testet außerdem Pull Requests usw. Für Open Source Projekte mit mehr als einem Contributor oder Projekten bei denen ein Testlauf relativ lange dauert, will man darauf nicht wirklich verzichten.
Außerdem gibt es noch Read the Docs, die automatisiert Sphinx Dokumentation bauen und hosten. Ebenfalls sehr praktisch und einfacher als sowas selbst zu bauen.
Code: Alles auswählen
project
├── project
│ └── __init__.py
└── tests
└── docs
└── setup.py
└── README
└── LICENSE
Alle Module/Packages sollten unter dem project Package zu finden sein. Die Tests importieren was auch immer sie testen genauso wie anderer Code auch. Für die Dokumentation solltest du Sphinx benutzen, weder gibt es dazu eine ernstzunehmende Alternative noch wird dein Projekt jemand ernstnehmen falls du es nicht nutzt. Was genau die mit Apps meinst solltest du nochmal erläutern.
Zum generieren von sowas gibt es cookiecutter.
Wenn du bisher noch nirgendswo mitgearbeitet hast oder irgendwelche Projekte erstellst hast, gibt es noch eine Reihe von Tools die du kennen solltest:
pytest für Tests, bietet wesentlich mehr Features als unittest, macht schreiben von Tests deutlich angenehmer und ist stark erweiterbar, insbesondere pytest-xdist ist hier erwähnenswert was es dir erlaubt Tests parallel auszuführen oder auf anderen Maschinen über SSH.
virtualenv um Abhängigkeiten für unterschiedliche Projekte zu isolieren, Versionskonflikte zwischen unterschiedlichen Projekten zu vermeiden, das System sauber zu halten und sich in der Entwicklung befindende Projekte zu testen.
tox bietet sich an um Tests in unterschiedlichen virtualenvs auszuführen, das ist praktisch um die Tests auf unterschiedlichen Interpretern, mit unterschiedlichen Abhängigkeiten und Abhängigkeiten in unterschiedlichen Versionen zu testen. Außerdem lässt sich mit Tox Dokumentation gut testen oder automatisierte Coding Style Tests ausführen.
Für letzteres wäre übrigens noch pyflakes empfehlenswert. Für brauchbare Editoren gibt es Plug-ins mit denen sich Pyflakes auch integrieren lässt.
Da du ja hoffentlich git und zumindest für Open Source Projekte wahrscheinlich Github nutzt, solltest du auch Travis kennen. Damit kannst du Tests automatisiert mit jedem Commit ausführen lassen, testet außerdem Pull Requests usw. Für Open Source Projekte mit mehr als einem Contributor oder Projekten bei denen ein Testlauf relativ lange dauert, will man darauf nicht wirklich verzichten.
Außerdem gibt es noch Read the Docs, die automatisiert Sphinx Dokumentation bauen und hosten. Ebenfalls sehr praktisch und einfacher als sowas selbst zu bauen.
- lightos
- User
- Beiträge: 39
- Registriert: Montag 12. Dezember 2011, 19:39
- Wohnort: Raum Bruchsal
- Kontaktdaten:
OK, danke für die Übersicht.
Aber Frage dazu:
Das mit dem sys-Path ist unschön. Funktioniert zwar, aber ich suche eine einfache Lösung.
Zum Thema app:
Parallel zu tests gibt es bei mir immer noch den app folder für use-cases/samples/demos. Also weniger unittests im Fokus sondern "echte Anwendungen" als Anregung.
Hier habe ich dann das gleiche Problem.
Wenn das Paket mit setup ordentlich installiert wird, und damit im lib/site-packages liegt, klappt das natürlich.
Nur ist dann der sys.Path.insert fehl am Platz.
in sqlalchemy verwenden sie z.B. from .. import xxx
hIer bekomme ich aber immer den Fehler: Parent module not loaded, can not perform relative import.
Dazu gibt es diverse Diskussionen, aber richtig verstehen kann ich das nicht.
Aber Frage dazu:
Code: Alles auswählen
import os, sys
import unittest
current = os.path.dirname(__file__)
sys.path.insert(0, current + '/../project')
Zum Thema app:
Parallel zu tests gibt es bei mir immer noch den app folder für use-cases/samples/demos. Also weniger unittests im Fokus sondern "echte Anwendungen" als Anregung.
Hier habe ich dann das gleiche Problem.
Wenn das Paket mit setup ordentlich installiert wird, und damit im lib/site-packages liegt, klappt das natürlich.
Nur ist dann der sys.Path.insert fehl am Platz.
in sqlalchemy verwenden sie z.B. from .. import xxx
hIer bekomme ich aber immer den Fehler: Parent module not loaded, can not perform relative import.
Dazu gibt es diverse Diskussionen, aber richtig verstehen kann ich das nicht.