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 相关文章推荐
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
python找出因数与质因数的方法
Jul 25 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
python滑块验证码的破解实现
Nov 10 Python
解决Python中回文数和质数的问题
Nov 24 Python
python实现FTP循环上传文件
Mar 20 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
设置jupyter中DataFrame的显示限制方式
Apr 12 Python
python安装和pycharm环境搭建设置方法
May 27 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
PHP编实现程动态图像的创建代码
2008/09/28 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
初识PHP
2014/09/28 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
js中更短的 Array 类型转换
2011/10/30 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
python中global用法实例分析
2015/04/30 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Python简单遍历字典及删除元素的方法
2016/09/18 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
python二元表达式用法
2019/12/04 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
帕克纽约:PARKER NY
2018/12/09 全球购物
JD Sports西班牙:英国领先的运动服装公司
2020/01/06 全球购物
企业项目策划书
2014/01/11 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
银行服务理念口号
2015/12/25 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书