Seite 1 von 1
eigene Bibliotheken erstellen, best practices?
Verfasst: Freitag 27. März 2020, 10:41
von NoPy
Hi, insider!
Entschuldigt bitte diesen Allgemeinen Betreff, aber es geht mir genau darum.
Alle Python- Tutorials, die mir bislang untergekommen sind, hatten als Schwerpunkte die einfachen "wie mache ich was mit python".
Zu spezielleren Themen, wie regulären Ausdrücken, logging etc. findet man meist auch ausreichend Material.
Aber sobald Dinge komplex werden, hören die Infos auf.
Ganz konkret muss ich mir jetzt wiederverwendbaren Code zurechtlegen. Um auch langfristig die Übersicht zu behalten, würde ich das gern strukturieren und damit ergeben sich für mich u.a. folgende Fragen:
Mein Ansatz ist in etwa folgende Verzeichnisstruktur
- Wie gehe ich mit dem Testen um?
- Wie organisiere ich ein sinnvolles Logging?
- Wie greife ich von Modul_02_02 auf ein "Ding" on Modul_01_01 zu?
Habe versucht
Code: Alles auswählen
#im Modul Modul_02_01
from Bibliothek.Thema_01.Modul_01_01 import Ding
Das führt zu
Auch ein Fortgeschrittenentutorial oder ein Hinweis auf ein gutes Buch - vorzugsweise in deutsch, notfalls auch in englisch oder russisch - wäre auch willkommen.
Vielen Dank, dass ihr Euch die Mühe macht
NoPy
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Freitag 27. März 2020, 11:13
von Sirius3
Zum Logging gibt es ein How-To in der Dokumentation:
https://docs.python.org/3/howto/logging ... c-tutorial
Zum Testen steht viel in der Dokumentation zu pytest:
https://docs.pytest.org/en/latest/goodpractices.html
Und zur letzen Frage müßte man Deine tatsächliche Bibliotheksstruktur kennen. Das Verzeichnis `Bibliothek` scheint nicht im Suchpfad zu liegen. Innerhalb einer Bibliothek sollte man auch relative Importe nehmen.
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Freitag 27. März 2020, 11:20
von NoPy
Vielen Dank für die schnelle Antwort.
Ich weiß, im Logging- Tutorial stehen Möglichkeiten drin (wenn auch wenig strukturiert), wie man aus verschiedenen Modulen "logging" betreibt.
Mich beschäftigt aber nicht so sehr die Frage, wie logge ich, sondern wann, was und unter welchen Bedingungen - best practices halt.
Gleiches gilt für den Teil mit den Tests.
Zum letzten Punkt: Wie kann ich denn "relativ" importieren, insbesondere in der oben benannten Situation (also aus Thema 2 in Thema 1)
In der Verzeichnisstruktur würde man schreiben
..\Thema_01\Modul_01_01
Wie würde man denn ".." in der Import- Hierarchie darstellen?
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Freitag 27. März 2020, 15:40
von __blackjack__
@NoPy: Wenn `Bibliothek` nicht gefunden wird, dann wurde das nicht richtig installiert — wie hast Du es denn installiert?
Beim Logging ist ja eigentlich nur das INFO-Level etwas wo nicht klar ist was man damit macht. Da musst Du Dich halt fragen was Dich da interessieren würde. Das ist hochgradig Geschmackssache.
Relative Importe mache ich persönlich nur wenn das was importiert wird auf gleicher oder tieferer Ebene in der Hierarchie steht, also finde ich den absoluten Import schon in Ordnung so. Wenn man relativ nach oben geht, macht man IMHO zu viele Annahmen über andere (Teil-)Pakete
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Freitag 27. März 2020, 16:31
von NoPy
@__blackjack__: Natürlich ist sie noch nicht installiert, ich schreibe sie ja gerade. Daher eben die Frage, wie ich "relativ" importieren kann. Hierarchisch ginge natürlich grundsätzlich, aber das schränkt natürlich ein. Ich möchte in einem "Thema" beispielsweise allgemeine Tools zur Verfügung stellen, die von den spezielleren Themen dann benutzt werden können.
Thema1 wäre also "tools" für die allgemeineren Sachen, Thema 2 könnte "geo" sein und Thema 3 "datenbank". Es geht nicht darum, eigene Datenbankmodule zu schreiben, sondern fachorientierte Spezialisierungen dort unterzubringen, also konkrete Datenbanken betreffende.
Auch wenn Du persönlich "absolute" importe bevorzugst, kannst Du mir vielleicht mitteilen, wie relative Importe in diesem Fall funktionieren?
Zum Thema Logging: Geschmackssache ist so ein großes Wort, so allgemein kann ich das auch sagen. Was hat sich für Dich konkret denn als geeignet erwiesen? Unterschiedliche DEBUG- Level (also unterhalb von INFORMATION), ein log.debug zum Beginn einer jeden Funktion? Assertions? Loggen auch abgefangener Exceptions? ein Logfile pro Modul oder für die ganze Bibliothek? Ein gemeinsames Logfile für die Bibliothek und den "Kunden" der Bibliothek?
Also mit welchen "Konzepten" arbeitest Du so? Gern so konkret, wie es geht.
Vielen Dank!
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Freitag 27. März 2020, 21:06
von __blackjack__
@NoPy: Das ist keine Frage von relativen oder absoluten Importen. *Beides* geht nur wenn `Bibliothek` als Package gefunden werden kann, also wenn das in den Suchpfaden liegt. Dass das nicht installiert ist, ist gar nicht so natürlich, denn man kann auch Bibliotheken ”editable” installieren.
Ich nehme nur ein DEBUG-Level bzw. mag ganz gerne noch ein TRACE-Level für *wirklich* kleinteilige Information. Und ich baue kein DEBUG auf Vorrat ein, sondern wirklich nur wenn ich Fehler suche was ich dazu dann halt brauche.
Wie Assertions jetzt ins Logging reinspielen ist mir nicht so ganz klar. Ich benutze die, da wo ich Invarianten und Nachbedingungen sehe und für Fälle die niemals eintreten dürften. Halt das für was man Assertions so verwendet.
Falls abgefangene Ausnahmen irgendeinen Wert haben kann man die natürlich auch loggen. Eher selten würde ich sagen. Eigentlich nur an Punkten wo sie nicht nach oben durchschlagen und sonst verloren gehen könnten. Also beispielsweise in Threads oder GUI-Callbacks.
Logfile pro Modul oder Bibliothek ist bei Bibliotheken nicht die Frage, die sich derjenige stellen muss, der die Bibliothek schreibt. Der hat dafür zu sorgen das im Normalzustand gar nichts irgendwo hingeloggt wird. Was dann wohin geloggt wird, mit welchen Leveln und für welche Module bestimmt der ”Kunde”.
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Montag 30. März 2020, 09:00
von NoPy
@__blackjack__:
Vielen Dank für Deine Ausführungen. So habe ich es gemeint, best practices halt. (assertions passen nicht zum Logging, aber zum Thema insgesamt, daher auch dafür danke).
Bleibt noch die offene Frage:
Wenn ich NICHT installieren will, ehe ich fertig bin - wie kann ich dann einen Import der Form
..\AnderesThema\ModulXY
realisieren?
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Montag 30. März 2020, 09:26
von __deets__
Man kann mit setuptools Bibliotheken mittels "python setup.py develop" so in ein virtualenv einhaengen, dass sie sich importieren lassen als ob, aber der Code bleibt einfach wie er ist, und jede Aenderung wird sichtbar. So mache ich das.
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Montag 30. März 2020, 09:31
von __blackjack__
@NoPy: Noch mal: relativer oder absoluter Import machen da keinen Unterschied, das Package *muss* in beiden Fällen in einem der Suchpfade liegen in denen Python nach Packages/Modulen sucht. Das Problem musst Du so oder so *erst* lösen.
Am einfachsten ist es, wenn man sonst nichts ändern will, dafür zu sorgen, dass das Package im aktuellen Arbeitsverzeichnis liegt, denn dort wird regulär auch nach Modulen/Packages gesucht.
Ansonsten steht im Tutorial in der Python-Dokumentation was es so zu den verschiedenen Importvarianten zu wissen gibt.
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Montag 30. März 2020, 12:04
von NoPy
[/quote]
__deets__ hat geschrieben: Montag 30. März 2020, 09:26
Man kann mit setuptools Bibliotheken mittels "python setup.py develop" so in ein virtualenv einhaengen, dass sie sich importieren lassen als ob, aber der Code bleibt einfach wie er ist, und jede Aenderung wird sichtbar. So mache ich das.
Klingt umständlich, aber möglicherweise muss ich das so machen. Gibt es dafür ein geeignetes Tutorial? Sich das aus der Doku zusammenzupuzzlen ist ausgesprochen mühsam. Wenige tiefergehende Details, daher viel Versuch, viel Irrtum.
__blackjack__ hat geschrieben: Montag 30. März 2020, 09:31
@NoPy: Noch mal: relativer oder absoluter Import machen da keinen Unterschied, das Package *muss* in beiden Fällen in einem der Suchpfade liegen in denen Python nach Packages/Modulen sucht. Das Problem musst Du so oder so *erst* lösen.
Das hatte ich falsch verstanden, entschuldige.
__blackjack__ hat geschrieben: Montag 30. März 2020, 09:31
Am einfachsten ist es, wenn man sonst nichts ändern will, dafür zu sorgen, dass das Package im aktuellen Arbeitsverzeichnis liegt, denn dort wird regulär auch nach Modulen/Packages gesucht.
Ich hab es jetzt mit
gelöst.
Das nervtötende ist, dass ich das im Grunde jetzt (währen der Entwicklung) in jedes Modul reinschreiben muss.
Wenn es dann fertig ist, dann muss ich es wieder überall streichen.
Und wenn ich es dann mal weiterentwickle, dann muss ich den dann möglicherweise anderen Pfad wieder überall so hineinkopieren.
Dafür gibt es doch sicherlich eine bessere Möglichkeit, oder?
__blackjack__ hat geschrieben: Montag 30. März 2020, 09:31
Ansonsten steht im Tutorial in der Python-Dokumentation was es so zu den verschiedenen Importvarianten zu wissen gibt.
Wie gesagt, an der Oberfläche gibt es da jede Menge Infos, aber sich die Details zusammenzusuchen und auszuprobieren, das ist ausgesprochen ermüdend

Aber vielleicht kennst Du ja ein anderes Tutorial, als ich? Ein passender Link wäre nett.
Vielen Dank an alle, die sich hier um mich gekümmert haben.
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Montag 30. März 2020, 12:27
von __deets__
Der bessere Weg ist der Weg, den ich dir genannt habe:
- virtualenv anlegen
- setup.py fuer die Bibliothek anlegen (muss man eh machen, wenn man die buendlen und verteilen will)
- python setup.py develop ausfuehren, und schon ist sie in dem venv verfuegbar.
Und nein, ich habe keinen Link auf ein Tutorial - den suche ich genauso lang wie du, denn ich mache das ja schon. Ich lese die also nicht. Es gibt bestimmt Leute, die sowas aufgeschrieben haben.
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Montag 30. März 2020, 14:40
von NoPy
__deets__ hat geschrieben: Montag 30. März 2020, 12:27
Der bessere Weg ist der Weg, den ich dir genannt habe:
- virtualenv anlegen
- setup.py fuer die Bibliothek anlegen (muss man eh machen, wenn man die buendlen und verteilen will)
- python setup.py develop ausfuehren, und schon ist sie in dem venv verfuegbar.
Und nein, ich habe keinen Link auf ein Tutorial - den suche ich genauso lang wie du, denn ich mache das ja schon. Ich lese die also nicht. Es gibt bestimmt Leute, die sowas aufgeschrieben haben.
Okay, ich versuche es mal so, wobei ich noch nicht weiß, wie ich es in die FME hineinbekomme, da ich bislang nur die Möglichkeit kenne, die Module händisch an eine geeignete Stelle zu kopieren.
Ich habe
- virtualenv installiert (windows)
- eine Testumgebung angelegt
- dabei wurden angelegt
- Verzeichnis "Lib" (mit allen Modulen, die ich je für diese Python- Version installiert hatte)
- Verzeichnis "Scripts" mit allen möglichen Dateien, einschließlich python- dll, pip etc.
- Datei "pyvenv.cfg", in welcher im Grunde Verweise auf das Python steht, die ich als Basis genommen habe (habe 4 Versionen installiert)
Wo genau lege ich nun meine Bibliothek und die Setup.py an? Im Wurzelverzeichnis? Unter Lib?
Wie geht es jetzt weiter?
Ich danke Dir für Deine Hilfe.
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Montag 30. März 2020, 15:25
von __deets__
Du legst *niemals* etwas in einem venv an. Hier nicht, und auch sonst nicht.
Du hast deine Library wo auch immer du deine Projekte hast, und *da* hast du eine setup.py, und mit aktiviertem venv sagst du dann eben 'python setup.py develop'
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Dienstag 31. März 2020, 08:51
von DasIch
Statt virtualenv und setuptools könnte man überlegen auch
poetry zu nutzen. Es erstellt ein virtualenv implizit (wenn man dass nicht deaktiviert) und von der UX ist es vergleichbar mit npm/yarn, ist also wesentlich einfacher zu benutzen.
Wenn man nicht gerade C extensions kompilieren muss oder so eine ganz gute Option. Hat auch im Vergleich zu setuptools eine recht gute Dokumentation.
Das erklärt auch wie man Abhängigkeit als "path dependency" angibt die dann in editable mode installiert werden:
https://python-poetry.org/docs/cli/#add
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Dienstag 31. März 2020, 09:00
von NoPy
__deets__ hat geschrieben: Montag 30. März 2020, 15:25
Du legst *niemals* etwas in einem venv an. Hier nicht, und auch sonst nicht.
Du hast deine Library wo auch immer du deine Projekte hast, und *da* hast du eine setup.py, und mit aktiviertem venv sagst du dann eben 'python setup.py develop'
Nun bin ich verwirrt: Wie hilft mir das dann beim Entwickeln und Debuggen? Müsste ich dann nicht nach jeder Änderung die setup.py starten, damit sich das in die virtuelle Umgebung ergießt und in der kann ich dann debuggen?
Könntest Du den Ablauf, den Du fährst, mal von vorn bis hinten kurz skizzieren? (Stichpunkte reichen sicher, dazu kann ich dann ja wieder suchen)
Also Szenario: Du willst eine Bibliothek von NULL anfangen, debuggen, ausliefern
Vielen Dank!
DasIch hat geschrieben: Dienstag 31. März 2020, 08:51
Statt virtualenv und setuptools könnte man überlegen auch
poetry zu nutzen.
Auch Dir vielen Dank, aber ich würde gern erst einmal einen Weg zu Ende versuchen.
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Dienstag 31. März 2020, 09:26
von __deets__
Du willst ein neues Projekt beginnen, WorldDomination. Und das neue Projekt braucht deine gute alte Bibliothek InstillFearAndDespair, die du dabei gleich etwas weiterentwickeln willst. Also machst du
- cd ~/projects/WorldDomination
- python3 -mvenv venv # ein venv in dem Projekt an dem du arbeiten willst
- source venv/bin/activate # aktivieren des venv, Windows ggf anpassen
- cd ~/projects/InstillFearAndDespair
- python setup.py develop # python ist das aus dem venv durch die Aktivierung
Und schon kannst du an InstillFearAndDespair arbeiten, und jede Aenderung wird sofort uebernommen, ohne setup.py wieder bemuehen zu muessen. Hast du mal die Dokumentation zu dem develop feature gelesen?
Re: eigene Bibliotheken erstellen, best practices?
Verfasst: Mittwoch 1. April 2020, 17:28
von NoPy
__deets__ hat geschrieben: Dienstag 31. März 2020, 09:26
Du willst ein neues Projekt beginnen, WorldDomination. Und das neue Projekt braucht deine gute alte Bibliothek InstillFearAndDespair, die du dabei gleich etwas weiterentwickeln willst. Also machst du
- cd ~/projects/WorldDomination
- python3 -mvenv venv # ein venv in dem Projekt an dem du arbeiten willst
- source venv/bin/activate # aktivieren des venv, Windows ggf anpassen
- cd ~/projects/InstillFearAndDespair
- python setup.py develop # python ist das aus dem venv durch die Aktivierung
Und schon kannst du an InstillFearAndDespair arbeiten, und jede Aenderung wird sofort uebernommen, ohne setup.py wieder bemuehen zu muessen.
Vielen Dank, da arbeite ich mich mal durch
__deets__ hat geschrieben: Dienstag 31. März 2020, 09:26
Hast du mal die Dokumentation zu dem develop feature gelesen?
Noch nicht, da schau ich auch mal rein.