自动将所有模块导入并重新加载到文件夹中

时间:2019-05-31 17:13:55

标签: python-2.7 python-import

我有一个文件夹,其中包含多个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

如果我reload(package),也应该正确地重新加载子模块。

这种做法有意义吗?是否会导致将来出现问题,特别是如果使用多个嵌套文件夹实现,则第一个将重新加载链中的所有其他文件夹? 是否有更好,更整洁的方法来解决同一问题?

0 个答案:

没有答案