Referenz-Sample Python 3.X

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
lightos
User
Beiträge: 39
Registriert: Montag 12. Dezember 2011, 19:39
Wohnort: Raum Bruchsal
Kontaktdaten:

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?
BlackJack

Puh, da sollte fast jedes grössere Projekt herhalten können. Ich schmeisse mal SQLAlchemy in den Ring: https://bitbucket.org/zzzeek/sqlalchemy/src
Benutzeravatar
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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

In der Regel hat man eine Grundstruktur die in etwa so aussieht:

Code: Alles auswählen

project
├── project
│   └── __init__.py
└── tests
└── docs
└── setup.py
└── README
└── LICENSE
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.
Benutzeravatar
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:

Code: Alles auswählen

 

import os, sys
import unittest

current = os.path.dirname(__file__)
sys.path.insert(0, current + '/../project')
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.
Antworten