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中的ctime()方法使用教程
May 22 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
Jun 11 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
python远程邮件控制电脑升级版
May 23 Python
python安装requests库的实例代码
Jun 25 Python
pytorch 固定部分参数训练的方法
Aug 17 Python
pymysql模块的操作实例
Dec 17 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 Python
Python集合set()使用的方法详解
Mar 18 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
一步一步学习PHP(8) php 数组
2010/03/05 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
vue的for循环使用方法
2019/02/12 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
python绘制雪景图
2019/12/16 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
全球在线商店:BerryLook
2019/04/14 全球购物
中西医专业毕业生职业规划书
2014/02/24 职场文书
高中教师考核方案
2014/05/18 职场文书
施工安全生产承诺书
2014/05/23 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
工作保证书怎么写
2015/02/28 职场文书
财政局个人年终总结
2015/03/03 职场文书
人生遥控器观后感
2015/06/11 职场文书
宝塔更新Python及Flask项目的部署
2022/04/11 Python
Python数组变形的几种实现方法
2022/05/30 Python