python热补丁机制

2020年9月11日 / 9次阅读 / 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条留言

    电子邮件地址不会被公开。 必填项已用*标注

    • 麦新杰

      而且还只能用reload函数,我测试了用import_module函数来代替reload,测试失败。 [回复]


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top