如何在自定义包中动态重新加载模块?
如何在自定义包中动态重新加载模块?
我正在尝试重新加载我编写的整个自定义模块包。\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如果这种方法不好,请指引我更好的方向!
问题的原因是需要动态重新加载一个自定义包中的模块。解决方法是使用imp模块直接访问Python的基本导入器,从源代码重新导入模块,然后将其替换在sys.modules中。
在modules/__init__.py文件中,通过遍历自定义包中的所有模块来重新加载模块。如果模块已经在sys.modules中存在,则通过imp.load_source方法从源文件重新导入模块,并替换在sys.modules中的对应模块。如果模块不存在,则不做任何操作。
loadModule方法用于加载模块。首先调用reload(modules)来重新加载自定义包中的所有模块。然后检查已经加载的模块列表,如果要加载的模块已经存在,则调用modules.reload方法重新加载该模块。最后尝试从modules中获取加载的模块,并将其保存在self.loadedModules字典中。
以上就是解决动态重新加载自定义包中模块的方法。