当前位置: 首页 > 科技观察

Python表演操作:模块重载的五种方法

时间:2023-03-20 22:01:32 科技观察

环境准备新建一个foo文件夹,里面有一个bar.py文件$treefoofoo└──bar.py0目录,1filebar.py内容很简单,随便写一个print语句print("successfultobeimported")只要导入一次bar.py就执行。打印禁止重复导入。由于sys.modules的存在,当你导入一个导入的模块时,其实并没有什么作用。.>>>fromfooimportbarsuccessfultobeimported>>>fromfooimportbarsuccessfultobeimported>>>fromfooimportbar>>>Reload模块方法1如果你用python2(记得在foo文件夹下加一个__init__.py),有reload方法可以直接使用>>>fromfooimportbarsuccessfultobeimported>>>fromfooimportbar>>>>>>reload(bar)successfultobeimported如果你用的是python3,方法比较多,参考下面reload模块方法2详解如果你使用Python3.0->3.3,那么你可以使用imp.reload方法>>>fromfooimportbarsuccessfultobeimported>>>fromfooimportbar>>>>>>importimp>>>imp.reload(bar)successfultobeimported但是这种方法不推荐用于Python3.4+:1:DeprecationWarning:theimpmoduleisdeprecatedinfavourofimportlib;seethemodule'sdocumentationforalternativeusesoverloadedmodulemethodthreeifyou使用Python3.4+,请使用importlib.reload方法>>>fromfooimportbar成功导入>>>fromfooimportbar>>>>>>importimportlib>>>importlib.reload(bar)successfultobeimported重新加载模块的方法明白了,也可以用下面的方法>>>fromfooimportbarsuccessfultobeimported>>>fromfooimportbar>>>>>>bar.__spec__.loader.load_module()successfultobeimported重载模块方法五既然影响我们重复导入的是sys.modules,那么我们只需要从中移除导入的包就可以了对吧?>>>importfoo.barsuccessfultobeimported>>>>>>importfoo.bar>>>>>>importsys>>>sys.modules['foo.bar']>>>delsys.modules['foo.bar']>>>>>>importfoo.barsuccessfultobeimported大家有没有发现,在前面的例子中,我使用的是fromfooimportbar,但是在这个例子,我用了importfoo.bar,这是为什么呢?这是因为如果您使用fromfooimportbar并希望删除sys.modules以重新加载模块,此方法将失败。这应该算是一个小坑吧,不知道人会不会掉进坑里爬不出来。>>>importfoo.barsuccessfultobeimported>>>>importfoo.bar>>>>>>importsys>>>delsys.modules['foo.bar']>>>fromfooimportbar>>>