模块搜索顺序、重复导入、模块加载列表
0x00 模块搜索顺序:
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
模块的路径搜索顺序:
程序主目录,脚本所在目录
PYTHONPATH目录,包含python的path路径:标准库目录和第三方包目录
环境变量:命令行敲的字符串,依次在路径中搜索
当import 一个模块时,会依次的在以上路径顺序中查找,找到了就不再往后找了,找不到就导入异常,只搜索指定目录,不递归搜索。
路径可以是字典、zip文件、egg文件(蟒蛇蛋)。
.egg文件,是由setuptools库创建的包,添加了元数据(版本号、依赖项等)的zip文件。下一篇文章介绍。
windows优先搜索".",即当前目录
linux只会从环境变量中的路径中挨个找。
比如,当我们在本地写了一个print.py时,windows下模块搜索顺序优先搜索当前目录,然后才是python的path路径 --> 标准库目录,由于当前目录下自定义了一个print模块,所以可能会导致其它模块print()打印异常
0x01 模块的重复导入:
1)创建以下三个文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
2)修改下test.py:
1 2 3 4 5 6 7 8 |
|
上面我们修改test.py后,导入了两次test1模块,但解释器并没有运行两次,也就是模块不会重复的导入。
3)再修改下test.py和test1.py:
1 2 3 4 5 6 7 8 9 10 11 |
|
这次我们先在test.py中先后导入了test2、test1模块,但从输出结果中看,test1.py中导入的test2模块也没有加载初始化,说明程序入口模块已经导入了某模块时,其它调用的模块也不会重复导入该模块。
4)再修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
这次依然可以通过test1.test2.x的方式访问test2模块中的x属性。
总结:
内存编址
共享物理内存
0x02 模块加载列表:
1 2 3 4 |
|
其中部分模块及模块指向的位置:
1 2 3 4 5 6 7 8 |
|
其中部分模块是导入sys模块时,sys模块调用的模块,其中的'__main__'模块指向的是当前脚本名。