Hallo,
ich habe mich im Importsystem von Python 3.5/3.6 etwas verlaufen.
Folgendes Problem:
Ich will eine Art Plugin-System bei meiner Pythonanwendung
(Kommandozeile) realisieren. Im Prinzip habe ich ein Verzeichnis namens
tools. Das soll beim Aufruf des Scripts gescanned werden und die darin
befindlichen Module importiert werden.
Ich habe hier ein paar Probleme:
1. Dynamisch statt statisch. Normalerweise würde ich ja etwas schreiben,
wie from tools.hex_tools import hex_tools und dann kann ich in meinem
Hauptprogramm die Funktionen nutzen.
2. Es gibt mehrere Möglichkeiten:
Ich könnte beispielsweise den PYTHONPATH anpassen oder per
sys.path.append() den Suchpfad anpassen. Wenn ich das per
sys.path.append() mache, dann muss ich offenbar den Pfad rekursiv
angeben.
Ich wollte das Verzeichnis so aufbauen:
1 | tools
|
2 | +----__init__.py
|
3 | +----hex_tools
|
4 | __init__.py
|
5 | hex_tools.py
|
6 | +----bla_tools
|
7 | __init__.py
|
8 | bla_tools.py
|
Ich hatte gedacht, ich müsste dann nur "tools" als "meta-package"
importieren und die Subpackages würden mit angezogen. Damit könnte
einfach ein neues Subpackage hinzugefügt werden und wird direkt
angezogen. Ich kriege das nur leider nicht so recht auf die Kette.
Ich habe probiert, in der _init_.py von tools die Submodule per
os.walk zu finden und per __import__() zu importieren. aus irgendeinem
Grund werden die dann im Hauptprogramm immer noch nicht gefunden.
Was immer geht: from tools.hex_tools import hex_tools
Ich habe schon versucht, den String einfach per Stringfunktionen
zusammenzusetzen und dann per "eval" auszulösen...ging net... :(
Es gibt so viele Möglichkeiten und nichts macht irgendwie Sinn. :/ Kann
mir gerade helfen, aus dem Jungle wieder herauszukommen? :D
Python ist echt super, weil man sich so viel zur Laufzeit zusammensuchen
und zusammenbauen kann, aber hier komme ich einfach nicht weiter...