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中将阿拉伯数字转换成中文的实现代码
May 19 Python
python中关于日期时间处理的问答集锦
Mar 08 Python
Python中类的定义、继承及使用对象实例详解
Apr 30 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
Python3实现购物车功能
Apr 18 Python
Sanic框架Cookies操作示例
Jul 17 Python
使用PM2+nginx部署python项目的方法示例
Nov 07 Python
Python常用的json标准库
Feb 19 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
django使用channels实现通信的示例
Oct 19 Python
python搜索算法原理及实例讲解
Nov 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
PHP基础知识介绍
2013/09/17 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
jquery isType() 类型判断代码
2011/02/14 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Python单元测试与测试用例简析
2019/11/09 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
国贸专业的职业规划范文
2014/01/23 职场文书
2014年个人委托书范本
2014/10/13 职场文书
面试通知短信
2015/04/20 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA