第10.3节 Python导入模块能否取消导入?

模块导入后,是否可以取消导入?实际上当模块导入后,是无法逆向还原到导入前的状态的,但是可以利用“del 模块名”进行导入模块的删除,此时的删除只是删除了导入模块对应的模块变量名,删除后在调用时找不到模块了,但并没有真正删除整个导入模块。为什么这么说呢?这是因为删除后与删除前Python系统内相关的处理不同:
1、 首次导入会执行导入的模块文件,而导入后删除模块在此导入不会执行模块文件;
2、 使用《第10.2节 查看导入的Python模块》介绍的方法还是可以查看到模块名。
请看如下案例:

>>> import importtest
Now in importtest module!
>>> importtest.ftest()
execute ftest function....
>>> del importtest
>>> importtest.ftest()
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    importtest.ftest()
NameError: name 'importtest' is not defined
>>> import importtest #删除后倒入没有执行模块文件
>>> importtest.ftest()
execute ftest function....
>>> import sys
>>> for m in sys.modules:
	if str(sys.modules[m]).find(r'(built-in)')==-1 and str(sys.modules[m]).find(r'C:\Program Files\Python37')==-1 :print('模块名:',m,', 模块来源: ',sys.modules[m])

执行结果如下:

模块名: _frozen_importlib , 模块来源:  <module 'importlib._bootstrap' (frozen)>
模块名: _frozen_importlib_external , 模块来源:  <module 'importlib._bootstrap_external' (frozen)>
模块名: importlib._bootstrap , 模块来源:  <module 'importlib._bootstrap' (frozen)>
模块名: importlib._bootstrap_external , 模块来源:  <module 'importlib._bootstrap_external' (frozen)>
模块名: pyexpat.errors , 模块来源:  <module 'pyexpat.errors'>
模块名: pyexpat.model , 模块来源:  <module 'pyexpat.model'>
模块名: xml.parsers.expat.model , 模块来源:  <module 'pyexpat.model'>
模块名: xml.parsers.expat.errors , 模块来源:  <module 'pyexpat.errors'>
模块名: importtest , 模块来源:  <module 'importtest' from 'c:\pythonsrc\importtest.py'>
>>>

执行截图:
在这里插入图片描述

本节简单介绍了是的能对导入模块进行逆向反导入,可以看到导入的模块可以删除但并不能真正反导入。每个模块只被导入一次,放入字典sys.module中,如果你改变了模块的内容,你必须重启程序,python不支持重新加载或卸载之前导入的模块。

老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython

请大家多多支持,点赞、评论和加关注!谢谢!

原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643657.html