2016-12-20 3 views
2

In Python muss ich eine Klasse aus einem Modul in einem Paket importieren. Ich versuche, mein Programm erweiterbar zu machen, ohne den Quellcode zu bearbeiten, indem ich Apps in einem Verzeichnis habe. Zum Beispiel habe ich die folgende Verzeichnisstruktur haben:Dynamischer Klassenimport von Modul

Project/ 
    apps/ 
     __init__.py 
     a.py 
     b.py 
    main.py 

In beiden a.py und b.py, gäbe es eine Klasse sein, die Ich mag würde direkt in main.py, als ob die Klasse in main.py die ganze Zeit war importieren. Ich kenne die Namen dieser Apps oder die darin enthaltenen Klassen nicht. Gibt es eine Möglichkeit, dies zu tun?

Ich habe auch für eine Antwort vergebens gegoogled.

BEARBEITEN. Ich habe vergessen zu erklären, dass ich die Importe dynamisch sein musste. Entschuldigen Sie die Umstände.

+0

https://docs.python.org/3/tutorial/modules.html#packages – wwii

+0

Was meinen Sie sie dynamisch sein müssen? Werden Sie Dinge zur Laufzeit bedingt importieren? Haben Sie [importlib] (https://docs.python.org/3/library/importlib.html) angeschaut und ausprobiert? – wwii

Antwort

1

Ich reparierte dies mit Hilfe von einem Freund. Danke Ihnen allen für Ihre Vorschläge.

import importlib.machinery 
import os 
for module in os.listdir(apps_dir)[2:]: 
    temp = importlib.machinery.SourceFileLoader(module, 'apps/' + module).load_module() 
    globals().update(temp.__dict__) 
0

Ich denke, das sollte funktionieren, in main.py

import apps.a 
import apps.b 

apps.a.MyClassA 
apps.b.MyClassB 

oder alternativ können Sie auch

from apps.a import MyClassA 
from apps.b import MyClassB 
0

Wenn Sie nur die Klasse im Hauptnamensraum, dann (in main.py):

from .apps.a import ClassA 
from .apps.b import ClassB 

Sie müssen eine __init__.py Datei in dielegenVerzeichnis auch.

Verwandte Themen