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

本文探讨了Python中模块导入的机制,解释了为何模块导入后无法完全逆向反导入,以及如何通过删除模块变量来阻止对已导入模块的访问。同时,文章详细展示了模块在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.youkuaiyun.com/LaoYuanPython

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

<think>我们正在回答用户关于Python导入模块的不同方式和用法的问题。根据引用内容,我们可以总结出几种常见的导入方法,并结合示例进行说明。引用[1]提到,模块是第三方编写的工具,Python自带一些常用模块(如math),使用前需要导入。引用[2]和引用[3]详细说明了导入模块的几种具体方法,包括:1.import模块名2.from模块名import代码元素(函数、变量等)3.使用别名(as)引用[4]进一步补充了四种方法,并举例说明。下面我们将详细解释这些方法,并给出示例。注意:在回答中,我们会按照用户的要求使用正确的LaTeX格式,但本问题中涉及的主要是代码示例,因此数学公式较少,但我们会确保在需要时使用正确的格式。另外,我们将按照要求生成相关问题。回答结构:1.介绍模块导入的基本概念2.分别介绍四种导入方法,并给出示例3.注意事项4.生成相关问题由于用户要求使用中文,我们将用中文回答。</think>### Python导入模块的不同方式及用法 在Python中,模块是包含函数、类和变量的代码文件,通过导入模块可以复用代码。以下是四种主要导入方式及其用法: #### 1. **import 模块名**(完整导入) ```python import math print(math.sqrt(16)) # 调用math模块的sqrt函数 ``` - **特点**:需通过`模块.函数名`访问 - **优点**:避免命名冲突 - **适用场景**:需要频繁使用同一模块的多个功能时[^1] #### 2. **import 模块名 as 别名**(别名导入) ```python import numpy as np array = np.array([1, 2, 3]) # 使用np代替numpy ``` - **特点**:简化长模块名的调用 - **优点**:提高代码可读性和输入效率 - **适用场景**:模块名较长或需要区分同名模块时[^2] #### 3. **from 模块名 import 元素**(指定导入) ```python from datetime import date today = date.today() # 直接调用date类 ``` - **特点**:直接使用元素无需模块前缀 - **优点**:简化调用语法 - **风险**:可能引发命名冲突(如本地有同名变量) - **适用场景**:仅需使用模块的少量特定功能时[^3] #### 4. **from 模块名 import ***(全元素导入) ```python from math import * print(sin(pi/2), log(10)) # 直接使用所有函数 ``` - **特点**:导入模块所有公开元素 - **风险**:高概率命名冲突、降低代码可读性 - **建议**:生产环境慎用,仅推荐在交互式环境中使用[^4] --- ### 关键注意事项 1. **模块搜索路径**: - 优先搜索当前目录 - 其次搜索`sys.path`中列出的路径 ```python import sys sys.path.append(&#39;/custom/path&#39;) # 添加自定义模块路径 ``` 2. **初始化操作**: - 导入时会执行模块中所有顶层代码 - 使用`if __name__ == &#39;__main__&#39;:`避免非预期执行 3. **缓存机制**: - 模块在首次导入后会被缓存到`sys.modules` - 重复导入不会重新执行模块代码 4. **包导入**: ```python from package.submodule import function # 导入模块 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值