Python代码热重载函数reload
代码热重载是在一个项目中比较常见的需求,而不是每次修改代码后需要重启服务就变得尤为重要。由于最近正好在一个Python项目中需要实现热重载需求,因此写了个python版的代码热重载demo,仅供参考。
Python reload()函数介绍
- 描述
reload() 用于重新载入之前载入的模块。 - 语法
reload() 函数语法:
reload(module) - 参数
module – 模块对象。 - 返回值
返回模块对象。
python中的reload函数
python2中的reload函数可以直接使用,无需导入第三方模块,可以直接使用:
1 | reload(module) # reload接收的参数必须是已经导入的模块 |
python3中的reload函数移到了imp库里面,因此ß需要导入:
1 | from imp import reload |
Demo-01
demo1是基于最常见的需求,即同一个目录下有2个文件(plugin.py,scan.py),scan.py文件调用plugin.py文件。
plugin.py文件如下:
1 | #! /usr/bin/env python |
scan.py文件如下:
1 | #! /usr/bin/env python |
运行scan.py,然后手工修改plugin.py文件内容,观察输出的变化。
1 | $ python scan.py |
Demo-02
Demo-02会稍微复杂一点点,即同一个目录下有2个文件(plugin.py,scan.py),scan.py文件调用plugin.py文件里面的crack函数。
plugin.py文件如下:
1 | #! /usr/bin/env python |
scan.py文件如下:
1 | #! /usr/bin/env python |
运行scan.py,然后手工修改plugin.py文件内容,观察输出的变化。
1 | $ python scan.py |
观察运行结果可以看出,在调用之前先reload一下模块,然后再利用eval调用该模块的crack函数。
Demo-03
Demo-03针对更为现实的需求,即不同目录下的2个文件(./scan.py,./plugins/plugin.py),scan.py文件调用plugins目录下的plugin.py文件里面的crack函数。
plugin.py文件如下:
1 | #! /usr/bin/env python |
scan.py文件内容如下:
1 | #! /usr/bin/env python |
运行scan.py,然后手工修改plugin.py文件内容,观察输出的变化。
1 | $ python scan.py |
观察运行结果可以看出,reload不支持from plugins improt plugin
的方式重载模块,因此可以使用import plugins.plugin
的方式导入模块并重载。