Frage

Während es ziemlich trivial in Python ist ein „Kind“ Modul in ein anderes Modul zu importieren und seine Attribute aufzulisten, wird es etwas schwieriger, wenn Sie importieren möchten alle Kind-Module.

Ich baue eine Bibliothek von Werkzeugen für eine bestehende 3D-Anwendung. Jedes Werkzeug hat einen eigenen Menüpunkt und Untermenüs. Ich würde das Werkzeug seine eigene Menüs, wie viele von ihnen möchte verantwortlich sein ändern auf Kontext und Vorlagen basieren für die Erstellung. Ich würde meine Basismodul in der Lage sein mag all Kind-Module zu finden und zu prüfen, ob eine create_menu() Funktion und rufen sie, wenn er sie findet.

Was ist der einfachste Weg, um alle untergeordneten Module zu entdecken?

War es hilfreich?

Andere Tipps

Ich denke, der beste Weg, diese Art von Plugin, was zu tun ist mit entry_points und die API für sie abfragt.

Wenn ich war eine Art und nur in Python Anfang Programmierung ich dies für mein modulares IRC-Bot geschrieben haben:


    # Load plugins

    _plugins = []

    def ifName(name):
        try:
            return re.match('([^_.].+)\.[^.]+', a).group(1)
        except:
            return None

    def isValidPlugin(obj):
        from common.base import PluginBase
        try:
            if obj.__base__ == PluginBase:
                return True
            else:
                return False
        except:
            return False

    plugin_names = set(ifilter(lambda a: a!=None, [ifName(a) for a in os.listdir(os.path.join(os.getcwd(), 'plugins'))]))
    for plugin_name in plugin_names:
        try:
            plugin = __import__('plugins.'+plugin_name, fromlist=['plugins'])
            valid_plugins = filter(lambda a: isValidPlugin(a), [plugin.__getattribute__(a) for a in dir(plugin)])
            _plugins.extend(valid_plugins)
        except Exception, e:
            logger.exception('Error loading plugin %s', plugin_name)

    # Run plugins

    _plugins = [klass() for klass in _plugins]

Es ist nicht sicher oder „richtige“ Art und Weise, aber vielleicht ist es wir dennoch nützlich sein. Es ist sehr alter Code, so wenden Sie sich bitte schlagt mich nicht.

Die Lösung das Dateisystem oben durchquert für Submodule zu finden, ist in Ordnung, solange Sie jedes Plugin als Dateisystem basiertes Modul implementieren.

Eine flexiblere Möglichkeit wäre eine explizite Plugin-Liste in Ihrem Hauptmodul sein, und hat jedes Plugin (ob ein Modul von Datei erstellt, dynamisch oder sogar Instanz einer Klasse) mich ausdrücklich zu dieser Liste hinzuzufügen. Vielleicht über eine Funktion register.

Denken Sie daran:. "Explicit ist besser als implizite" ist Teil der zen von Python

Sie können versuchen, das Verzeichnis globbing:

import os
import glob

modules = glob.glob(os.path.join('/some/path/to/modules', '*.py'))

Dann können Sie versuchen, sie zu importieren:

checked_modules
for module in modules:
    try:
        __import__(module, globals(), locals()) # returns module object
    except ImportError:
        pass
    else:
        checked_modules.append(module)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top