Python代码热重载函数reload

Python代码热重载函数reload

代码热重载是在一个项目中比较常见的需求,而不是每次修改代码后需要重启服务就变得尤为重要。由于最近正好在一个Python项目中需要实现热重载需求,因此写了个python版的代码热重载demo,仅供参考。

Python reload()函数介绍

  • 描述
    reload() 用于重新载入之前载入的模块。
  • 语法
    reload() 函数语法:
    reload(module)
  • 参数
    module – 模块对象。
  • 返回值
    返回模块对象。

python中的reload函数

python2中的reload函数可以直接使用,无需导入第三方模块,可以直接使用:

1
reload(module) # reload接收的参数必须是已经导入的模块

python3中的reload函数移到了imp库里面,因此ß需要导入:

1
2
from imp import reload
reload(module)

Demo-01

demo1是基于最常见的需求,即同一个目录下有2个文件(plugin.py,scan.py),scan.py文件调用plugin.py文件。
plugin.py文件如下:

1
2
3
4
5
6
7
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import time

Now = time.strftime('%Y-%m-%d %H:%M:%S')
print("Now: %s,Start executing plugin code..." % Now)

scan.py文件如下:

1
2
3
4
5
6
7
8
9
10
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from imp import reload

import time
import plugin
while 1:
reload(plugin)
time.sleep(1)

运行scan.py,然后手工修改plugin.py文件内容,观察输出的变化。

1
2
3
4
5
6
7
8
$ python scan.py
Now: 2019-04-11 16:14:43,Start executing plugin code ...
Now: 2019-04-11 16:14:44,Start executing plugin code ...
Now: 2019-04-11 16:14:45,Start executing plugin code ...
Now: 2019-04-11 16:14:46,Start executing plugin code ...
Now: 2019-04-11 16:14:47,Start executing plugin code ......
Now: 2019-04-11 16:14:48,Start executing plugin code ......
Now: 2019-04-11 16:14:49,Start executing plugin code ......

Demo-02

Demo-02会稍微复杂一点点,即同一个目录下有2个文件(plugin.py,scan.py),scan.py文件调用plugin.py文件里面的crack函数。
plugin.py文件如下:

1
2
3
4
5
6
7
#! /usr/bin/env python
# -*- coding: utf-8 -*-

def crack():
import time
Now = time.strftime('%Y-%m-%d %H:%M:%S')
print("Now: %s,Start executing plugin code ......" % Now)

scan.py文件如下:

1
2
3
4
5
6
7
8
9
10
11
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from imp import reload

import time
import plugin
while 1:
reload(plugin)
eval("plugin.crack()")
time.sleep(1)

运行scan.py,然后手工修改plugin.py文件内容,观察输出的变化。

1
2
3
4
5
6
7
8
9
10
11
12
$ python scan.py
Now: 2019-04-11 16:18:49,Start executing plugin code ......
Now: 2019-04-11 16:18:50,Start executing plugin code ......
Now: 2019-04-11 16:18:51,Start executing plugin code ......
Now: 2019-04-11 16:18:52,Start executing plugin code ......
Now: 2019-04-11 16:18:53,Start executing plugin code ......
Now: 2019-04-11 16:18:54,Start executing plugin code ......
Now: 2019-04-11 16:18:55,Start executing plugin code ...
Now: 2019-04-11 16:18:56,Start executing plugin code ...
Now: 2019-04-11 16:18:57,Start executing plugin code ...
Now: 2019-04-11 16:18:58,Start executing plugin code ...
Now: 2019-04-11 16:18:59,Start executing plugin code ...

观察运行结果可以看出,在调用之前先reload一下模块,然后再利用eval调用该模块的crack函数。

Demo-03

Demo-03针对更为现实的需求,即不同目录下的2个文件(./scan.py,./plugins/plugin.py),scan.py文件调用plugins目录下的plugin.py文件里面的crack函数。
plugin.py文件如下:

1
2
3
4
5
6
7
#! /usr/bin/env python
# -*- coding: utf-8 -*-

def crack():
import time
Now = time.strftime('%Y-%m-%d %H:%M:%S')
print("Now: %s,Start executing plugin code ......" % Now)

scan.py文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from imp import reload

import time
exec("import plugins.plugin")

while 1:
reload(eval("plugins.plugin"))
eval("plugins.plugin.crack()")
time.sleep(1)

运行scan.py,然后手工修改plugin.py文件内容,观察输出的变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ python scan.py
Now: 2019-04-11 16:25:10,Start executing plugin code ......
Now: 2019-04-11 16:25:11,Start executing plugin code ......
Now: 2019-04-11 16:25:12,Start executing plugin code ......
Now: 2019-04-11 16:25:13,Start executing plugin code ......
Now: 2019-04-11 16:25:14,Start executing plugin code ......
Now: 2019-04-11 16:25:15,Start executing plugin code ......
Now: 2019-04-11 16:25:16,Start executing plugin code ......
Now: 2019-04-11 16:25:17,Start executing plugin code ......
Now: 2019-04-11 16:25:18,Start executing plugin code ...
Now: 2019-04-11 16:25:19,Start executing plugin code ...
Now: 2019-04-11 16:25:20,Start executing plugin code ...
Now: 2019-04-11 16:25:21,Start executing plugin code ...

观察运行结果可以看出,reload不支持from plugins improt plugin的方式重载模块,因此可以使用import plugins.plugin的方式导入模块并重载。

本文标题:Python代码热重载函数reload

文章作者:shuke

发布时间:2020年04月23日 - 16:04

最后更新:2020年04月23日 - 16:04

原始链接:https://shuke163.github.io/2020/04/23/Python%E4%BB%A3%E7%A0%81%E7%83%AD%E9%87%8D%E8%BD%BD%E5%87%BD%E6%95%B0reload/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------

本文标题:Python代码热重载函数reload

文章作者:shuke

发布时间:2020年04月23日 - 16:04

最后更新:2020年04月23日 - 16:04

原始链接:https://shuke163.github.io/2020/04/23/Python%E4%BB%A3%E7%A0%81%E7%83%AD%E9%87%8D%E8%BD%BD%E5%87%BD%E6%95%B0reload/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%