小結:
在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文件