小结:
在Python3.6中
- 源文件存在时,import会比较源文件与__pycache__里相应文件的时间戳,来决定是否重新生成缓存编译文件
- 源文件不存在时,import会导入相应的.pyc文件
以下以一个小实验进行比较:
1. 创建 main.py
#!/usr/bin/env python # -*- coding:utf-8 -*- '''import测试 结论: 在有源文件的条件下,import总是会根据源文件在__pycache__目录下生成最新pyc文件 在没有源文件的情况下,import 才会导入相应目录下的.pyc(python编译文件) ''' import amodule
2. 创建 amodule.py
print(2)
print(__file__)
3. 创建 build.py
# -*- coding: utf-8 -*- import compileall import os compileall.compile_dir(os.path.abspath(os.path.dirname(__file__)),legacy=True,force=True)
4. 用build.py编译文件
5. 执行main.py
运行main.py后,会发现当前目录下创建了__pycache__目录,该目录下生成了amodule.cpython-36.pyc
6. 修改 amodule.py
print(3)
print(__file__)
7. 再用build.py编译文件
8. 再执行main.py
运行main.py后,会发现更新了 当前目录\__pycache__amodule.cpython-36.pyc 文件
10. 删除 amodule.py 文件及 __pycache__ 目录
11. 再执行main.py
此时导入的是amodule.pyc文件