Forum: PC-Programmierung Python3: Module dynamisch finden und importieren


von Philipp X. (caradhras)


Lesenswert?

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...

von Kaj (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.