2010-12-22 18 views
0

Ich versuche, ein Plugin-System zu erstellen, und ich habe eine Funktion, die alle Module in ein Array importiert.Mehrere Importe des gleichen Dateinamens

Layout Plugins:

pluginsDir/

pluginsDir/Chat

pluginsDir/Chat/main.py

Und dies ist die Funktion, die findet und importiert Plugins:

if os.path.exists(pluginsDir): 
    for path, dirArray, fileArray in os.walk(pluginsDir): 
     for fileName in fileArray: 
      if fileName == "main.py": 
      sys.path.append(path) 
      try: 
       plugins.append(__import__("main")) 
      except: 
       print 'Could not import plugin, "'+path+'": plugin contains errors or is not a real plugin.' 

Das ist in Ordnung, wenn ich nur ein Plugin habe, aber wenn ich mehrere Plugins habe, importiert es immer das erste Plugin, das es entdeckt.

Layout Plugins:

pluginsDir/

pluginsDir/Chat

pluginsDir/Chat/main.py

pluginsDir/build

pluginsDir/build/main .py

Ich habe versucht, sys.path.remove(path) nach meiner try-Anweisung hinzuzufügen, aber es entfernt den Pfad nicht, nachdem ich das Modul bereits importiert habe.

Was kann ich tun, um meine Plugins korrekt zu importieren?

Antwort

4

sys.path.append(path) wird den Plugin-Ordner an die Ende von sys.path anhängen. Da Python Ordner in sys.path von vorne nach hinten durchsucht, wird das Hinzufügen von zusätzlichen Pfaden am Ende der Liste nicht gefunden, da main.py-Module in dem zuvor unter sys.path angegebenen Ordner Module in Ordnern am Ende der Liste verbergen. Stattdessen können Sie sys.path.insert(0, path) verwenden, um neue Pfade am Anfang der Liste hinzuzufügen.

Sie sollten sich Python packages ansehen, um die Plugins besser strukturieren zu können.

sys.path.insert(0, path_to_plugindir) 
for folder in dirArray: 
    __import__(folder) 
+0

Danke, das sollte gut funktionieren. – MetaDark

0

Ihre innere for-Schleife ist nicht eingerückt, ich sehe nicht, warum Ihr Code überhaupt läuft. Durch das Korrigieren der Einrückung könnte das Problem behoben werden.

+1

Das ist, weil ich meinen Code geändert auf, hier zu sein besser lesbar, aber ich endete eine Vertiefung Wegnehmen bis:

plugindir/ __init__.py plugin1/ __init__.py plugin2/ __init__.py 

Mit Python-Paketen, kann die Schleife in Ihrem Skript einfach mit umgesetzt werden. – MetaDark

2

Das Python-Modul-System ist nur eine sehr coole Möglichkeit, Namespaces zu behandeln. Das Importieren mehrerer Module mit demselben Namen in Ihren aktuellen Namespace führt zu Unordnung.

Keine Notwendigkeit, die pluginsDir zu durchlaufen und jede Datei zu importieren, Python wird das für Sie tun (aus pluginsDir importieren *). Wenn main.py nur Initialisierungsstuff ausführt, können Sie den Code zu pluginsDir/chat/__init__.py verschieben.

Import PluginsDir bezieht sich auf Ihre Plugins wie 'pluginsDir.chat' wird als bessere Praxis angesehen.

+0

Ich muss dies mit meiner Methode tun, da die Plugins dynamisch, nicht statisch sind. Wenn also ein Plugin hinzugefügt wird, erkennt mein Skript es nicht mit dieser Methode. – MetaDark

+0

Sie können den eingebauten Funktions-Reload verwenden. http://docs.python.org/library/functions.html#reload –

Verwandte Themen