Python3.6 import源文件与编译文件的关系

小结:

    在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文件

原文地址:https://www.cnblogs.com/yaoyu126/p/6472669.html