注册 登录
Python基础教程

第一章: 环境搭建,安装Python

第二章: 挑选一款趁手的IDE

第三章: 计算机基础知识

第四章: 命令行基础知识

第五章: 从全局把握Python

第六章: Python语言基础

第七章: Python流程控制

第八章: Python数据类型与运算

第九章: Python字符串类型

第十章: Python列表类型

第十一章: Python元祖类型

第十二章: Python字典类型

第十三章: Python集合类型

第十四章: Python函数处理

第十五章: Python文件处理

第十六章: Python面向对象

第十七章: Python异常处理

第十八章: Python模块处理

第十九章: Python项目实战

首页 > Python基础教程 > 第十八章: Python模块处理 > 18.2节:Python模块的导入机制

18.2节:Python模块的导入机制

薯条老师 2020-05-26 08:35:09 209702 0

编辑 收藏

教程引言:

系统地讲解计算机基础知识,Python的基础知识, 高级知识。关注微信公众号[薯条编程],领取该教程的PDF电子书:《Python零基础入门指南》。目

18.2.1 sys.modules

执行import进行模块导入以后,Python解释器会自动将导入的模块名写入到内置模块sys的modules属性中。 sys.modules是一个字典对象,键名为模块名。

sys模块是Python中的内置模块,在18.4节中会详细的介绍Python中的内置模块。

现在我们进入windows命令行,切换到chapter18所在的目录,然后执行python进入交互模式:

>>> import sys
>>> "utils" in sys.modules
False
>>> import utils
>>> "utils" in sys.modules
True

在交互模式中首先导入了sys模块,然后执行"utils" in sys.modules,查找是否已导入utils模块,由于未执行导入,所以返回值为False。再次执行import,导入utils模块,此时再通过sys.modules进行查找时,返回值为True。

18.2.2 sys.path

模块导入成功以后,Python会在sys.modules中进行记录,以避免模块的重复导入。在导入的过程中,会首先在sys.modules中进行查找,如果查找失败,按"就近原则",会首先在当前目录进行查找,查找是否有同名的模块脚本,如果又查找失败呢?Python解释器接下来会去环境变量PYTHONPATH中进行查找,最后再去Python的系统目录中进行查找。

PYTHONPATH的配置同环境变量PATH,对环境变量配置不是很熟悉的同学,可以复习第四章中的学习内容。

不论是当前目录,还是PYTHONPATH中的路径,Python在当前执行环境中,会将所有的查找路径写入到sys模块的path属性中。sys.path是一个列表类型, 我们现在进入交互模式,在交互模式中进行验证:

>>> import sys
>>> type(sys.path)
<class 'list'>
>>> sys.path
['', 'C:\\Users\\chipscoco\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\chipscoco\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\chipscoco\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\chipscoco\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\chipscoco\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Users\\chipscoco\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

从交互模式的输出可知,sys.path是一个列表类型,sys.path保存了所有查找路径,Python解释器在sys.path中,会按从左到右的顺序进行模块查找。sys.path中的第一项为空字符串,表示当前目录。

sys.path是一个列表类型,可以在运行时进行修改。

模块如果最终查找失败,Python会抛出ModuleNotFoundError的错误异常。我们现在进入Python交互模式,在交互模式中导入不存在的A模块。

>>> import A
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'A'

如果查找成功,Python解释器会对模块进行编译,将其转译成字节码。

18.2.3 模块的编译与执行

Python是一种解释型语言,解释性语言与C/C++等编译型语言的一个很重要的区别在于,Python解释器会先将Python程序转译成中间代码,这里的中间代码是Python字节码。Python将模块转译成Python字节码以后,将字节码载入到内存中,在内存中对字节码逐条地解释执行。

程序运行结束以后,在windows系统中会在模块的目录下生成一个__pycache__的目录,目录下面的pyc文件即为python字节码。在Linux系统中会直接在模块的目录中生成pyc文件。如果未对模块进行修改,Python下次进行模块导入时,会直接使用字节码文件,这样就提升了程序的执行效率。

18.2.4 知识要点

(1) sys.modules是一个字典对象,字典对象的键名是一个字符串类型,对应的是模块的模块名。通过sys.modules可以防止模块的重复导入。
(2) Python在模块的查找过程中,遵循的是"就近原则", 会首先在当前目录进行查找,查找是否有同名的模块脚本,接着分别去PYTHONPATH以及Python的系统目录中进行查找。
(3) sys.path是一个列表类型,保存了模块的所有查找路径。

18.2.5 高薪就业班

(1) Python后端工程师高薪就业班,月薪8K-15K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪8K-20K, 免费领取课程大纲
(4) Python大数据工程师就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取学习资料:


欢迎 发表评论:

请登录

忘记密码我要注册

注册账号

已有账号?请登录