Импортируйте и перезагрузите все модули в папке автоматически - PullRequest
0 голосов
/ 31 мая 2019

У меня есть папка, содержащая несколько файлов Python и __init__.py, аналогично этому.

package
    __init__.py
    foo.py
    bar.py

Я хочу иметь возможность импортировать эту папку как модуль и автоматически импортировать из __init__.pyфайл все модули, содержащиеся в папке, а также.Когда я перезагружаю эту конкретную папку, все модули python, содержащиеся в ней, также должны автоматически перезагружаться.

Кроме того, поскольку мне придется работать с несколькими папками с таким же ограничением, я хотел бы запуститьэто из внешней служебной функции в файле с именем utils.py, поэтому мне не нужно копировать и вставлять мой код в каждый отдельный файл __init__.py моего проекта.

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

Вот код.Первый файл - это служебный файл, который содержит функцию, которую будет вызывать каждая папка __init__.py.

utils.py

import sys, os
import importlib


def load_module(path, caller):

    # cycle through every file in the given directory
    for file in os.listdir(path):

        # check if the file is a python file and not an __init__
        if file.endswith(".py") and file != "__init__.py":
            # get the name of the module, without extension, 
            name = os.path.splitext(file)[0]

            # and the full path of the module relative to the caller
            module = '%s.%s' %(caller, name)

            # if the module is in sys.modules, delete it so it can be reloaded
            if module in sys.modules:
                print "reloading", module                                      
                del sys.modules[module]

            # do the import of the module using importLib
            module_obj = importlib.import_module(module, caller)

            # add the module as a global variable in the caller 
            sys._getframe(1).f_globals[name] = module_obj    

            # add the module to sys.modules
            sys.modules[module] = module_obj

И вот как мой __init__.py будет выглядеть.

__ init __. Py

import os
import utils

path = os.path.dirname(__file__)
utils.load_module(path, __name__)

foo.py

a = "Working"

Используя вышеуказанные файлы, я могу сделать

import package
print package.foo.a

и если I reload(package), то субмодули также должны быть правильно перезагружены.

Имеет ли эта практика какой-либо смысл?Может ли это привести к будущим проблемам, особенно если они будут реализованы с несколькими вложенными папками, где первая перезагрузит все остальные в цепочке?Есть ли лучшие и более точные способы преодоления той же проблемы?

...