Динамически загружать пользовательские модули - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть простое приложение на Python для Visual FX (Pygame).Я хочу загрузить свои пользовательские модули в этом приложении.Каждый модуль имеет пользовательский vfx.

структура приложения:

app:
|
-main.py
-config.py
-modules
  |
  -01
    |
    -module.py
    -assets
  -02
    |
    -module.py
    -assets
  -XX
    |
    -module.py
    -assets

в module.py У меня есть:

    #import libs

def loadModules():
    dir = []
    list = os.listdir("modules")
    for d in list:
        path = os.path.abspath("modules") + os.sep + d
        if os.path.isdir(path) and os.path.exists(path + os.sep + "module.py"):
            dir.append(path + os.sep + "module.py")
    return dir
#init pygame & create scene
i = 0
while true
    #scene()
    sys.path.append(loadModules()[0])
    mod = importlib.import_module("module", __name__)
    mod.draw(scene)
    #print(plugin)
    sys.path.remove(plugin)

    if(i > 10):
         sys.path.append(loadPlugins()[1])
         mod = importlib.import_module("module", __name__)
         mod.draw(scene)
         #print(plugin)
         sys.path.remove(plugin)

    i += 1

Каждый module.py в модулях у меня есть метод

draw ()

для создания визуализаций

Как загрузить динамически несколько модулей со стандартным методом с одинаковым именем draw ()?В этом решении загружается только первый модуль, следующий модуль в следующем каталоге 02 не загружается.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Хорошо, но теперь загрузите только один модуль, а не все.Что я делаю неправильно? Проверьте это -> screen

edit:

Я нашел устаревшее решение:

for dir in loadModules():
    print(dir)
    imp.load_source('module', dir)
    import module
    module.draw()
0 голосов
/ 24 февраля 2019

loadModules()[0] всегда будет возвращать первый элемент dir, который всегда будет 01.

Вместо того, чтобы делать while True, вместо этого переберите все записи в loadModules():

for dir in loadModules():
    sys.path.append(dir)
    mod = importlib.import_module("module", __name__)
    mod.draw(scene)
    sys.path.remove(dir)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...