一. 路径问题
1. import语句搜索模块的路径顺序:
- 搜索程序运行时的路径(当前路径)
- sys.path提供的路径
- 搜索内置模块
2. 如何让程序找到自定义的模块:
- 使用安装的方法:将模块放到sys.path的任意一个路径下;
- 扩展sys.path的路径:
>>>import sys
>>>sys.path.append('path of module')
二. 模块的导入和执行过程
1. 模块的加载
- 加载过程
- 在模块导入时,模块所有语句会执行;
- 如果一个模块已经被导入,则再次导入时不会重新执行模块内的语句
- 重新加载
>>>import mymod
>>>import imp
>>>imp.reload(mymod) # 在运行时重新加载mymod模块
2. 模块被导入和执行的过程
- 搜索相关路径找到模块(.py文件);
- 判断是否有此模块对应的.pyc文件;
- 如果.pyc文件比.py文件新,则直接加载.pyc文件,否则用模块.py文件生成.pyc并加载执行;
- 备注:
- pyc模块的编译:.py ----编译---->.pyc----解释执行---->python3;
- 文件的时间戳很重要,由时间戳决定文件是否需要编译;
- 编译后的.pyc文件给到的还是python3解释执行器,而C语言编译后的.exe文件直接交给CPU执行;
- pyc文件是python3的一个缓存文件,存储的是字节编码,为了提高程序的加载速度和执行速度。
三. 模块的属性
1. 模块的隐藏属性
模块中以'_'开头的属性,在from xxx import *导入时将不被导入,通常这些属性称为隐藏属性,示例如下:
mymod5.py code:
运行结果:
2. 模块的__all__属性
模块的__all__属性绑定的是一个列表,用来存放可导出属性的字符串列表,限定当用from xxx import *语句导入时,只导入__all__列表内的属性。
mymod4.py code:
运行结果:
3. 模块的其它属性
- __doc__属性:绑定模块的文档字符串,模块内第一个没有赋值给任何变量的字符串为文档字符串;
- __file__属性:绑定模块对应的文件路径;
- __name__属性:记录模块的名称,常用来判断是否为主模块:
- 当此模块为主模块(也就是第一个运行的模块)运行时,__name__绑定'__main__';
- 当此模块不是主模块时,__name__绑定模块名(文件名去掉.py后缀)