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 相关文章推荐
python3简单实现微信爬虫
Apr 09 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
Python爬取APP下载链接的实现方法
Sep 30 Python
Python学习小技巧之列表项的推导式与过滤操作
May 20 Python
利用python将图片转换成excel文档格式
Dec 30 Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
python3.6 tkinter实现屏保小程序
Jul 30 Python
Window10下python3.7 安装与卸载教程图解
Sep 30 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
简单了解Python write writelines区别
Feb 27 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 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
DIY实用性框形天线
2021/03/02 无线电
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
python调用java的Webservice示例
2014/03/10 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
python 剪切移动文件的实现代码
2018/08/02 Python
pybind11在Windows下的使用教程
2019/07/04 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
实习生个人找工作的自我评价
2013/10/30 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
煤矿安全承诺书
2014/05/22 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
挂职学习心得体会
2014/09/09 职场文书
烈士陵园观后感
2015/06/08 职场文书
运动会入场词
2015/07/18 职场文书
一文搞懂Redis中String数据类型
2022/04/03 Redis
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server