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使用PIL缩放网络图片并保存的方法
Apr 24 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
在Python中定义一个常量的方法
Nov 10 Python
python实现推箱子游戏
Mar 25 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
浅谈Python中的异常和JSON读写数据的实现
Feb 27 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 Python
python playwrigh框架入门安装使用
Jul 23 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随机生成福彩双色球号码的2种方法
2013/02/04 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
python使用marshal模块序列化实例
2014/09/25 Python
Python实现Const详解
2015/01/27 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
pandas通过loc生成新的列方法
2018/11/28 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
一组SQL面试题
2016/02/15 面试题
南京某软件公司的.net面试题
2015/11/30 面试题
高中自我评价分享
2013/12/05 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
小学语文教学反思
2014/02/10 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
县委务虚会发言材料
2014/10/20 职场文书
小学教学工作总结2015
2015/05/13 职场文书
投诉信范文
2015/07/02 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
golang为什么要统一错误处理
2022/04/03 Golang
MongoDB数据库之添删改查
2022/04/26 MongoDB