2020年9月11日 / 367次阅读 / Last Modified 2020年9月11日
我们可以用importlib模块中的reload函数,实现python的热补丁机制。关键细节是,reload之前,要删除模块原来的.pyc文件。
from importlib import reload
import shutil
moda = """
def test1():
print('test---111')
"""
modb = """
def test1():
print('test---222')
print('if you see this, hot patch in python is ok')
"""
with open('_reload.py', 'w') as f:
f.write(moda)
f.flush()
import _reload
_reload.test1()
shutil.rmtree('__pycache__')
with open('_reload.py', 'w') as f:
f.write(modb)
f.flush()
reload(_reload)
_reload.test1()
这段代码先import _reload模块,调用其中的函数,然后删除.pyc文件,执行reload,重新装载模块,再次调用其中的函数。
执行效果如下:
E:\py>python print_r.py
test---111
test---222
if you see this, hot patch in python is ok
对于可能需要通过热补丁机制更换的代码块,源代码中,需要reload。
一个机智点的reload的想法可以这样:代码记录模块文件的最后修改时间,在某个循环中,如果发现模块文件被更新过,则删除其对应的.pyc文件,然后reload。
-- EOF --
本文链接:https://www.pynote.net/archives/2475
《python热补丁机制》有1条留言
前一篇:用或不用pow函数?
后一篇:python动态导入模块
©Copyright 麦新杰 Since 2019 Python笔记
而且还只能用reload函数,我测试了用import_module函数来代替reload,测试失败。 [ ]