2012-04-06 13 views
4

Was wäre der beste (lies: sauberste) Weg, Python mitzuteilen, alle Module aus einem Ordner zu importieren?Python: jedes Modul aus einem Ordner importieren?

Ich möchte Menschen erlauben, ihre "Mods" (Module) in einen Ordner in meiner App zu setzen, den mein Code bei jedem Start überprüfen und jedes Modul dorthin importieren sollte.

ich auch nicht wollen, einen zusätzlichen Umfang der importierten Sachen hinzugefügt (nicht „myfolder.mymodule.something“, sondern „etwas“)

+0

möglich Duplikat [Läden alle Module in einem Ordner in Python] (http://stackoverflow.com/questions/1057431/loading-all-modules-in-a-folder-in-python) –

+0

Überprüfen Sie einen ähnlichen Thread und seine Antwort hier: http://stackoverflow.com/questions/279237/python-import-a-module-from-a-folder – vaisakh

Antwort

5

Wenn Sie den Ordner selbst in einem Modul die Umwandlung, durch die Verwendung einer __init__.py Datei und mit from <foldername> import * sui ts Sie, können Sie über den Ordnerinhalt mit „os.listdir“ oder „glob.glob“, durchlaufen und jede Datei in „Py“ mit der __import__ integrierten Funktion endet importieren:

import os 
for name in os.listdir("plugins"): 
    if name.endswith(".py"): 
      #strip the extension 
     module = name[:-3] 
     # set the module name in the current global name space: 
     globals()[module] = __import__(os.path.join("plugins", name) 

Der Vorteil dieses Ansatzes ist: Sie können die Modulnamen dynamisch an __import__ übergeben - während die Anweisung "mport" die Modulnamen fest codiert benötigt und Sie andere Dinge über die Dateien überprüfen können - vielleicht die Größe oder ob sie bestimmte importieren erforderlichen Module, bevor sie importiert werden.

+0

Dies funktioniert immer noch in Python3.6, aber die letzte Zeile wird geändert in: 'import importlib; importlib.import_module ("plugins" + "." + module) ' –

+0

Danke - sie haben die Verwendung von Dateinamen in' __import__' abgelehnt. Die Funktion funktioniert auch noch, man muss nur "." dort anstelle von 'os.path.join' – jsbueno

1

eine Datei

__init__.py 

innerhalb der Namen erstellen Ordner und den Ordnernamen wie folgt importieren:

>>> from <folder_name> import * #Try to avoid importing everything when you can 
>>> from <folder_name> import module1,module2,module3 #And so on 
+0

bearbeitet meinen Beitrag mit mehr Informationen –

+0

Gut, dann wie in der Antwort vorgeschlagen, fügen Sie den Ordner in der os.path-Liste und importieren, was Sie brauchen. – luke14free

0

Vielleicht möchten Sie das Projekt, um zu versuchen: https://gitlab.com/aurelien-lourot/importdir

Mit diesem Modul benötigen Sie nur zwei Zeilen schreiben alle Plugins aus dem Verzeichnis zu importieren, und Sie brauchen keine zusätzliche __init__.py (oder jede andere andere zusätzliche Datei):

import importdir 
importdir.do("plugins/", globals()) 
+0

funktioniert es nur für Linux-Pfad? – Sajuuk

Verwandte Themen