python 模块重载的五种方法


Posted in Python onApril 24, 2021

环境准备

新建一个 foo 文件夹,其下包含一个 bar.py 文件

$ tree foo
foo
└── bar.py

0 directories, 1 file

bar.py 的内容非常简单,只写了个 print 语句

print("successful to be imported")

只要 bar.py 被导入一次,就被执行一次 print

禁止重复导入

由于有 sys.modules 的存在,当你导入一个已导入的模块时,实际上是没有效果的。

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>

重载模块方法一

如果你使用的 python2(记得前面在 foo 文件夹下加一个 __init__.py),有一个 reload 的方法可以直接使用

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> reload(bar)
successful to be imported
<module 'foo.bar' from 'foo/bar.pyc'>

如果你使用的 python3 那方法就多了,详细请看下面

重载模块方法二

如果你使用 Python3.0 -> 3.3,那么可以使用 imp.reload 方法

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import imp
>>> imp.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

但是这个方法在 Python 3.4+,就不推荐使用了

<stdin>:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses

重载模块方法三

如果你使用的 Python 3.4+,请使用 importlib.reload 方法

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import importlib
>>> importlib.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

重载模块方法四

如果你对包的加载器有所了解

还可以使用下面的方法

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> bar.__spec__.loader.load_module()
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

重载模块方法五

既然影响我们重复导入的是 sys.modules,那我们只要将已导入的包从其中移除是不是就好了呢?

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> sys.modules['foo.bar']
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
>>> del sys.modules['foo.bar']
>>>
>>> import foo.bar
successful to be imported

有没有发现在前面的例子里我使用的都是 from foo import bar,在这个例子里,却使用 import foo.bar,这是为什么呢?

这是因为如果你使用 from foo import bar 这种方式,想使用移除 sys.modules 来重载模块这种方法是失效的。

这应该算是一个小坑,不知道的人,会掉入坑中爬不出来。

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> del sys.modules['foo.bar']
>>> from foo import bar
>>>

以上就是python 模块重载的五种方法的详细内容,更多关于python 模块重载的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
Jan 17 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
关于python多重赋值的小问题
Apr 17 Python
Python爬虫学习之翻译小程序
Jul 30 Python
Python values()与itervalues()的用法详解
Nov 27 Python
python中如何打包用户自定义模块
Sep 23 Python
PyQt5中QSpinBox计数器的实现
Jan 18 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
May 20 Python
对象析构函数__del__在Python中何时使用
Mar 22 Python
写一个Python脚本自动爬取Bilibili小视频
python实现图片批量压缩
Apr 24 #Python
如何用python绘制雷达图
两行代码解决Jupyter Notebook中文不能显示的问题
python基础详解之if循环语句
Apr 24 #Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 #Python
You might like
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
PHP常用技巧汇总
2016/03/04 PHP
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
怎么清空javascript数组
2013/05/11 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
介绍一下Java中的static关键字
2012/05/12 面试题
个人租房协议书
2014/04/09 职场文书
环保建议书100字
2014/05/14 职场文书
德育标兵事迹材料
2014/08/24 职场文书
中学教代会开幕词
2016/03/04 职场文书
python实现剪贴板的操作
2021/07/01 Python
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL