在Python中实现模块热重新加载的最佳方法是什么?

时间:2018-06-18 01:38:42

标签: python

我有一个Python守护程序(聊天机器人),我希望能够在运行时重新加载本地模块,因为这些模块包含指示机器人行为的代码,并且可能已经使用新功能进行了更新。当然,重新启动整个机器人是一个非常不受欢迎的选择,因为这会导致相当长的停机时间。

目前我通过这种方式实现了这一目标:

module = importlib.import_module(module_name)
importlib.reload(module)

这是正确的方法吗?这种方法有什么问题吗?

1 个答案:

答案 0 :(得分:2)

我觉得你做得怎么样。我曾经这样做过。找出您的类已加载的模块的名称,重新加载该模块,然后将该实例的所有属性替换为重新加载的类中的相应属性:

import imp
import somemodule

class A(object):

    def __init__(self):
        pass

    def somemethod(self):

        return somemodule.somemethod()

    def reload(self):

        imp.reload(somemodule)
        modname = self.__class__.__module__
        mod = __import__(modname, fromlist = [modname.split('.')[0]])
        imp.reload(mod)
        new = getattr(mod, self.__class__.__name__)
        setattr(self, '__class__', new)

如果您需要更新多个模块或类,可以使其递归。 另请注意,您需要根据更新的模块按照彼此依赖的顺序重新加载所有模块。如果您使用from mod import something,则需要import modimp.reload(mod),然后重新加载当前模块。