我有一个Python守护程序(聊天机器人),我希望能够在运行时重新加载本地模块,因为这些模块包含指示机器人行为的代码,并且可能已经使用新功能进行了更新。当然,重新启动整个机器人是一个非常不受欢迎的选择,因为这会导致相当长的停机时间。
目前我通过这种方式实现了这一目标:
module = importlib.import_module(module_name)
importlib.reload(module)
这是正确的方法吗?这种方法有什么问题吗?
答案 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 mod
,imp.reload(mod)
,然后重新加载当前模块。