如何在自定义包中动态重新加载模块?

9 浏览
0 Comments

如何在自定义包中动态重新加载模块?

我正在尝试重新加载我编写的整个自定义模块包。\n这里有一个我参考过的另一个问题,但它看起来在我的情况下不起作用。\nmodules/__init__.py\n

# 基于 https://stackoverflow.com/questions/1057431/loading-all-modules-in-a-folder-in-python 中的信息
import os
for module in os.listdir(os.path.dirname(__file__)):
    if module[0:8] != '__init__' and module[-3:] == '.py':
        if module in dir(os.path.dirname(__file__)):
            reload(module)
        else:
            __import__(module[:-3], locals(), globals())
del module
del os

\n加载模块:\n

import modules
def loadModule(self, moduleName):
    """
    加载给定名称的模块
    例如,"admin"将加载 modules/admin.py
    参数:
        moduleName (str): 模块名称(admin将加载 admin.py 文件)
    返回:
        boolean: 加载成功或失败
    异常:
        None
    """
    retLoadedCorrectly = False
    # 重新加载所有内容以动态获取新内容
    reload(modules)
    # 获取模块
    try:
        m = getattr(modules, moduleName)
        # 保存它
        self.loadedModules[m.commandName] = {'module': moduleName, 'admin': m.adminOnly, 'version': m.version}
        # 它已成功加载 :)
        retLoadedCorrectly = True
        # 记录日志
        self.log('已加载模块:{0},{1},{2},{3}'.format(moduleName, m.commandName, m.adminOnly, m.version))
    except AttributeError:
        self.log('无法加载模块:{0}'.format(moduleName), level='WARNING')
    return retLoadedCorrectly

\n如果我调用 loadMudule(\"example\"),它将按预期加载和运行。然后,如果我更改 example,然后再次调用 loadModules 方法,它将无法获取更改。\n我了解到 importlib,但它似乎只适用于 Python 3,而我正在使用 Python 2.7.6\n如果这种方法不好,请指引我更好的方向!

0
0 Comments

问题的原因是需要动态重新加载一个自定义包中的模块。解决方法是使用imp模块直接访问Python的基本导入器,从源代码重新导入模块,然后将其替换在sys.modules中。

在modules/__init__.py文件中,通过遍历自定义包中的所有模块来重新加载模块。如果模块已经在sys.modules中存在,则通过imp.load_source方法从源文件重新导入模块,并替换在sys.modules中的对应模块。如果模块不存在,则不做任何操作。

loadModule方法用于加载模块。首先调用reload(modules)来重新加载自定义包中的所有模块。然后检查已经加载的模块列表,如果要加载的模块已经存在,则调用modules.reload方法重新加载该模块。最后尝试从modules中获取加载的模块,并将其保存在self.loadedModules字典中。

以上就是解决动态重新加载自定义包中模块的方法。

0