2016-12-20 3 views
2

В Python мне нужно импортировать класс из модуля в пакете. Я пытаюсь сделать мою программу расширяемой без редактирования исходного кода, имея приложения в каталоге. Для примера, я имею следующую структуру каталогов:Импорт динамического класса из модуля

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

В обоих a.py и b.py, было бы класс, который я хотел бы импортировать непосредственно в main.py, как если бы класс был в main.py все вместе. Я не знаю имен этих приложений или классов внутри них. Есть ли способ сделать это?

У меня также googled вокруг для ответа безрезультатно.

EDIT. Я забыл объяснить, что мне нужно, чтобы импорт был динамичным. Извините за беспокойство.

+0

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

+0

Что вы имеете в виду, они должны быть динамичными? Будете ли вы условно импортировать вещи во время выполнения? Вы посмотрели и попробовали [importlib] (https://docs.python.org/3/library/importlib.html)? – wwii

ответ

1

Я исправил это с помощью друга. Спасибо всем за ваши предложения.

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

Я думаю, что это должно работать, в main.py

import apps.a 
import apps.b 

apps.a.MyClassA 
apps.b.MyClassB 

или в качестве альтернативы вы можете также

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

Если вы хотите класс в пространстве имен основного, а затем (в main.py):

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

Вам необходимо разместить файл __init__.py в Project.