@DasIch : Danke das Du mich auf PEP 8 hingewiesen hast. Ich vergesse hin und wieder darauf zu achten.
Wie von DasIch schon erwähnte, ist meine Verzeichnisstruktur mehr als schlecht und hätte hier dem Grunde nach gar nicht geposted werden dürfen.
Gedanklich war ich bei den Ausführungen von BlackJack zu der __init__.py und habe ohne nachzudenken, einfach eine Verzeichnisstruktur von meiner SSD genommen.
Werde in Zukunft erst Denken und dann senden, damit so ein Unsinn, hier nicht unnötiger Weise berichtigt werden muss.
@BlackJack: Deine letzten Ausführungen teile ich uneingeschränkt. Darüber hinaus befürchte ich, das ich unter dem Namen "lib" etwas völlig anderes verstehe als Du.
Sorry, aber ich bin kein Softwareentwickler, für mich könnte das auch eine Abkürzung für lost in bytes sein.
Für Dich eher nicht, weil Du anscheinend etwas ganz bestimmtes damit assoziierst und diesen Namen hier eher nicht verwenden würdest.
Der Einfachheit halber habe ich, die nicht PEP 8 konformen Verzeichnisse entfernt und die Anmerkungen von BlackJack berücksichtigt :
Code: Alles auswählen
C:\Entwicklung
|+ eigene
| |+ app
| | |+ typer
| | | |+ config
| | | | |+ __init__.py
| | | | |+ preferences.py
| | | |
| | | |+ reports
| | | | |+ __init__.py
| | | | |+ html.py
| | | | |+ typer_reports.py
| | | | |+ stats.py
| | | |
| | | |+ tools
| | | | |+ __init__.py
| | | | |+ dict_differences.py
| | | |
| | | |+ __init__.py # vormals typer.py
Selbstverständlich kann das Modul typer_reports.py jetzt das Modul preferences.py importieren. import typer.config.preferences.
Auszug aus sys.path aus der Sicht des Moduls typer_reports.py zum Zeitpunkt des imports:
- C:\Entwicklung\eigene\app
- C:\Entwicklung\eigene\app\typer\reports
Unterhalb von /app kann ich weitere Packages erstellen.
Code: Alles auswählen
C:\Entwicklung
|+ eigene
| |+ app
| | |+ typer
.
.
.
| | |+ whydo
| | | |+ reports
| | | | |+ __init__.py
| | | | |+ whydo_reports.py
| | | |
| | | |+ __init__.py
Packages können Packages importieren.
Somit funktioniert auch aus typer_reports.py heraus ein import von whydo.reports.annual_reports.
Somit ist ein zentrales config Modul oder eine Bearbeitung der sys.path Liste nicht erforderlich.
@Amerika_befreie_uns
Wenn Du jetzt eine lose Ansammlung von Modulen hast, und keine Package-Struktur erstellen möchtest, findet Python alle Module unterhalb von ./* des jeweils ausführenden Moduls.
Alles was ../ ist, bleibt zunächst einmal unerkannt, weil nicht in sys.path enthalten. Das kann man entsprechend hacken, aber wie bereits geschrieben,
würde ich nicht einfach ein sys.path.append("../whydo") verwenden, da sys.path eine gewisse Struktur hat, und diese würde ich versuchen zu erhalten.
Derartige Hacks gehören für mich jedoch nicht in eine Produktionsumgebung. So etwas benutze ich nur, wenn ich mal eben etwas quick und dirty ausprobieren möchte.
Zurück zu Deinem Problem und Deiner Ordnerstruktur, ungeachtet den Anmerkungen zu den Verzeichnisnamen, sollte so etwas wie:
Code: Alles auswählen
Projekt
|+ Quellcode
| |+ __init__.py
.
|+ lib
| |+ __init__.py
bei Dir vorhanden sein.
Unterhalb von Quellcode und/oder lib kannst Du weitere Ordner/Verzeichnisse oder Module erstellen.
Jedes Verzeichnis muss dann aber auch eine __init__.py enthalten.
Dann kannst Du auch Verzeichnisübergreifende Packages und/oder einzelne Module importieren.
Zum Beispiel so: import lib.<Verzeichniss>.<modul> oder from lib.<Verzeichniss>.<modul> import <whatever> und musst nicht 50x den gleichen sys.path Hack implementieren.
Denke bitte daran, das auch import lib.<Verzeichniss>.<modul> as <name> funktioniert, wenn Du nicht ständig lib.<Verzeichniss>.<modul>.<funktionsname>() verwenden möchtest.
Schau Dir bitte einmal das Package twisted
https://pypi.python.org/pypi/Twisted an.
Dieses Entwicklerteam hält sich strickt an PEP 8 und sonstige Guidlines.
Hier könntest Du einige Anregungen finden, was alles in einer __init__.py stehen könnte und wie eine größere Verzeichnisstruktur aussehen würde.
Anstelle einer print Anweisung, kannst Du auch den import debuggen und siehst dann, step by step, welche Module wie verarbeitet werden.
Eine einfache print Anweisung kann auch mal schnell übersehen werden.