Seite 1 von 1

Experimente mit imp.load_module und packages

Verfasst: Sonntag 12. Oktober 2008, 22:29
von Pekh
Hallo!

Es geht um eine Art Plugin-System, wobei jedes Plugin aus einer Handvoll Dateien besteht, die der Einfachheit halber jeweils als Package organisiert sind. Es ergibt sich folgende Struktur:

Code: Alles auswählen

plugins
   - __init__.py(1)
   - plugindir1
       - __init__.py(2a)
       - irgendwelche Python-Dateien
   - plugindir2
       - __init__.py(2b)
       - irgendwelche Python-Dateien
__init__.py(1) und so weiter heißen natürlich alle '__init__.py', ich habe sie jetzt nur mal zwecks Deutlichkeit markiert.

In __init__.py(1) möchte ich jetzt automatisch alle Unterpakete importieren lassen. Dazu existiert folgender Code:

Code: Alles auswählen

import os
import imp

def register_plugins():
    # Pfad aus __file__ extrahieren
    path = os.path.abspath(os.path.split(__file__)[0])

    for name in os.listdir(path):
        # Wenn es ein Verzeichnis ist, prüfen ob es ein Package ist
        # und dieses ggf. laden
        if os.path.isdir(os.path.join(path, name)):
            try:
                f, fname, desc = imp.find_module(name, [path])
            except ImportError:
                continue

            module = imp.load_module(name, f, fname, desc)

register_plugins()
Die Pakete werden anstandslos importiert und finden sich in sys.modules wieder. Nur im Namespace des Paketes 'plugins' findet sich nichts. Wenn ich ein 'import paketXY' durchführe bindet er einen entsprechenden Namen. Warum funktioniert das bei meiner Lösung nicht? Kann mir da vielleicht jemand mal einen erhellenden Hinweis geben?

Vielen Dank im Voraus

Verfasst: Sonntag 12. Oktober 2008, 23:37
von Pekh
Ok, ein kleiner Nachtrag:

Das Paket 'plugins' befindet sich selbst in einem Paket 'lib'.

Wenn ich ipython im Paketverzeichnis von 'lib' starte und 'import plugins' eingebe, kommt es zu dem oben beschriebenen Verhalten. Wenn ich aber vom Hauptverzeichnis aus 'import lib.plugins' durchführe, werden die Plugins korrekt im Namespace von 'plugins' eingetragen. Warum auch immer. :roll:

Verfasst: Montag 13. Oktober 2008, 16:32
von Trundle
Warum sollten die Plugins überhaupt im Namespace von `plugins` auftauchen? Durch was denn? Dass bei einem ``import spam.eggs`` `eggs` in `spam` auftaucht, macht die `__import__`-Funktion für dich, nicht aber das `imp`-Modul.

Verfasst: Montag 13. Oktober 2008, 16:43
von Pekh
Nur, wieso funktioniert es dann, wenn ich eine Ebene höher gehe?

Verfasst: Montag 13. Oktober 2008, 16:53
von Trundle
IMHO tut es das mit dem gezeigten Code nicht, so dass man ohne konkreten Code nichts dazu sagen kann.

Verfasst: Montag 13. Oktober 2008, 17:11
von Pekh
Tut mir leid dich da enttäuschen zu müssen, aber das ist tatsächlich der Code wie er in der __init__.py steht. Ob es jetzt merkwürdig ist, daß es funktioniert, oder daß es nicht funktioniert, kann ich leider nicht sagen :lol:

Verfasst: Montag 13. Oktober 2008, 17:46
von Trundle
Damit meinte ich eher die Dateien drumherum.