Experimente mit imp.load_module und packages

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Sonntag 12. Oktober 2008, 22:29

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
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Sonntag 12. Oktober 2008, 23:37

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:
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Montag 13. Oktober 2008, 16:32

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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Montag 13. Oktober 2008, 16:43

Nur, wieso funktioniert es dann, wenn ich eine Ebene höher gehe?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Montag 13. Oktober 2008, 16:53

IMHO tut es das mit dem gezeigten Code nicht, so dass man ohne konkreten Code nichts dazu sagen kann.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Montag 13. Oktober 2008, 17:11

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:
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Montag 13. Oktober 2008, 17:46

Damit meinte ich eher die Dateien drumherum.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Antworten