2017-12-13 8 views
0

meine Verzeichnisstruktur SieheImport alle Module aus einem Verzeichnis in ein Array

exchange.py 
exchanges/ 
    kraken.py 
    gemini.py 
    bitfinex.py 

Jetzt in exchange.py würde Ich mag zu dynamisch Last alle Module von den Börsen so Ordner daß ich über sie iterieren und instanziiert die Klassen innerhalb programmgesteuert. Pseudo-Code:

exchanges = load_modules('exchanges') 
for module in exchanges: 
    config = module.CONFIG # a global 
    for class in module: 
     loaded_classes.append(module.class) # add each class in each module to a list 

Ziel ist jeder Beitrag zu erlauben, um eine Klasse zu erstellen, die von exchange.py erbt, steckt es in die exchanges Ordner und die App wird und seine Konfiguration automatisch laden.

Ich habe gesehen, this answer, die das os-Modul verwendet, um alle Dateien in einem Verzeichnis zu laden, aber das scheint mir unvernünftig hacky.

Antwort

0

hinzufügen __init__.py-exchanges Ordner, um es als ein Python-Paket machen

import sys 
sys.path(path_to_modules_directory) 

Damit können Sie alle Module importieren, indem Sie auf diese Weise mit

from exchanges import * 
+0

danke, aber zwei Fragen bleiben: 1/Ich dachte, das Hinzufügen von '__init __. Py' war veraltet, und 2/wie kann ich dann dynamisch auf die Namen, Unterklassen und Globals dieses Ordners Modul zugreifen? – bluppfisk

+0

Antworten 1. Ich denke, '__init __. Py' wird nicht abgeschrieben. 2. Sie können 'importlib' verwenden, um Ihre Aufgabe –

0

Sie Funktion __import__ oder Modul verwenden können importlib für mit Aufgabe. Für den ersten Gebrauch sollte Verzeichnis für Python-Datei scannen. Nach dem Import dann mit __import__ oder importlib. Besser nutzen importlib

Beispiel

import os 
import sys 

def import_libs(path): 
    sys.path.append(path) 
    return [__import__(os.path.join(path, module)) for module in filter(lambda x: x and x[-3:] == ".py", os.listdir("./modules/calculate/calculate"))] 

print(import_libs('exchanges')) 

Auch ich habe eine Frage? Warum musst du das tun? Ich denke, es wird besser sein, wenn Sie das Fabrikdesignmuster betrachten.

+0

zu erledigen, die für mich nicht funktionierte, aber Sie haben wahrscheinlich Recht, dass ich in das Fabrikdesignmuster schauen sollte. Noch nicht ganz da. Das Ziel ist, andere zu lassen ein Plugin erstellen, indem Sie eine Py-Datei fallen in die Börsen – bluppfisk

+0

Beispiel Ordner wie „Registry“ Klasse an einem bestimmten Container Klasse Registry (Typ): def registry_class (cls): Container = cls.container wenn nicht Behälter: return container.classes [cls.kind] = cls def __new __ (meta, name, Basen, dct): cls = Super (Registry, meta) .__ neue __ (meta, name, Basen, dct) cls.registry_class() Rückgabe cls –

+0

Auch __import__ oder Funktion im Modul importlib zurück dict wie Objekt. Das Objekt hat globale Inhalte und Locals der Modul- oder Klassenliste. –

Verwandte Themen