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读写Excel文件方法介绍
Nov 22 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
Oct 16 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 Python
sklearn+python:线性回归案例
Feb 24 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
pytorch损失反向传播后梯度为none的问题
May 12 Python
教你如何使用Python Tkinter库制作记事本
Jun 10 Python
python实现简单聊天功能
Jul 07 Python
Python序列化模块JSON与Pickle
Jun 05 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
也谈php网站在线人数统计
2008/04/09 PHP
解析htaccess伪静态的规则
2013/06/18 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
js实现在文本框光标处添加字符的方法介绍
2012/11/24 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
Python 用户登录验证的小例子
2013/03/06 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
2019/08/22 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
遥感技术与仪器求职信
2014/02/22 职场文书
疾病防治方案
2014/05/31 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2016春节放假通知范文
2015/08/18 职场文书
服务行业标语口号
2015/12/26 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
git中cherry-pick命令的使用教程
2022/06/25 Servers