Python3: Module dynamisch finden und importieren

OP #5456330
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...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.