Python之reload流程实例代码解析


Posted in Python onJanuary 29, 2018

本文研究的主要是Python之reload流程的相关内容,具体如下。

在Python中,reload() 用于重新载入之前载入的模块。

reload() 函数语法:

reload(module)

Python中 import 只执行一次,后续的 import 仅仅在 sys.modules 中查找是否存在对应的模块对象,而对于源文件进行修改后想要立即重新导入该文件而不想整体重新执行程序时, reload 就在该处派上用途了。在实际中,测试代码修改结果,或者对于不能停止的服务需要动态改变运行行为 reload 是非常有用的。

reload 的执行流程如下所示:

1)在 sys.modules 中查找到对应模块名的模块对象;

2)针对该模块名的 执行文件 属性,找到对应文件并重新编译该文件执行;

3)将代码执行中产生的对象依次更新到原模块对象的属性中;

从上面执行流程中我们可以看到如下几点:

1)模块对象是可变的,在 reload 执行过程中只是修改了该模块对象,因此在 reload 后原来的引用还是指向该模块对象;

2)reload 过程中,文件中代码重新执行,创建新的对象并绑定到模块的属性中;

3)reload 模块中的 import 和 reload 流程与该模块是否 reload 无关,一个模块 reload 并不会导致其中的 import 递归重新载入;

4)对于 from * import * 来说其相当于是在本地创建了同名的变量指向模块中的同名属性所引用对象, reload 会创建新对象(部分不可变对象除外),其仍然指向旧变量,一般情况下需要重新赋值;

基于此,测试如下代码:

#----- 被导入代码 reloadImported.py ------ 
print(' excute code in imported file') 
x = [] 
y = 1 
 
#----- 测试代码 test.py -------- 
sep = ': ' 
print('---- import module ----') 
import reloadImported 
from reloadImported import x 
print(' id(reloadImported)', id(reloadImported), sep=sep) 
print(' id(reloadImported.x)', id(reloadImported.x), sep=sep) 
print(' id(reloadImported.y)', id(reloadImported.y), sep=sep) 
print(' id(x)', id(x), sep=sep) 
 
print('---- reload module ----') 
from importlib import reload 
reload(reloadImported) 
print(' id(reloadImported)', id(reloadImported), sep=sep) 
print(' id(reloadImported.x)', id(reloadImported.x), sep=sep) 
print(' id(reloadImported.y)', id(reloadImported.y), sep=sep) 
print(' id(x)', id(x), sep=sep) 
from reloadImported import x 
print(' new x id(x)', id(x), sep=sep)

执行结果如下所示:

---- import module ---- 
 excute code in imported file 
 id(reloadImported): 30322880 
 id(reloadImported.x): 29841208 
 id(reloadImported.y): 1502597584 
 id(x): 29841208 
---- reload module ---- 
 excute code in imported file 
 id(reloadImported): 30322880 
 id(reloadImported.x): 29842088 
 id(reloadImported.y): 1502597584 
 id(x): 29841208 
 new x id(x): 29842088

总结

以上就是本文关于Python之reload流程实例代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python random模块(获取随机数)常用方法和使用例子
May 13 Python
python在windows下实现ping操作并接收返回信息的方法
Mar 20 Python
实例解析Python中的__new__特殊方法
Jun 02 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
python字符串替换第一个字符串的方法
Jun 26 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
Python中的默认参数实例分析
Jan 29 #Python
Python使用遗传算法解决最大流问题
Jan 29 #Python
Python subprocess模块详细解读
Jan 29 #Python
python微信跳一跳游戏辅助代码解析
Jan 29 #Python
Python面向对象之继承代码详解
Jan 29 #Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 #Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 #Python
You might like
PHP+MySQL5.0中文乱码解决方法
2006/11/20 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
jQuery在ul中显示某个li索引号的方法
2015/03/17 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
Django实现分页功能
2018/07/02 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
Python中调用其他程序的方式详解
2019/08/06 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
推广普通话标语
2014/06/27 职场文书
故意杀人案辩护词
2015/05/21 职场文书
培训感想范文
2015/08/07 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
MySQL分库分表与分区的入门指南
2021/04/22 MySQL
Python常遇到的错误和异常
2021/11/02 Python
Redis实战高并发之扣减库存项目
2022/04/14 Redis
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis