好奇:.pyc和 __pycache__是啥?
你是否好奇,在某些 Python 工程中,当执行了 xxx.py脚本后,多出了 __pycache__目录?这个目录下存放的是一些 .pyc结尾的文件。
这些文件,叫做 python bytecode。 官方文档中是这样描述的:
继续好奇:何时产生 .pyc 文件?
当导入模块的时候,如果被导入的模块,未曾产生过 .pyc文件, 就会生成 .pyc文件。我们尝试写一个最简单的模块 hello, 它只提供 greet()函数,具体实现为:
hello/init.py: 内容为空
hello/hello.py:
def greet():print("hello world")
调用这个模块:main.py:
from hello import helloif __name__ == '__main__':hello.greet()
好,我们观察在第一次引入模块前、引入后,整个目录的变化:
可以看到, 在第一次导入了 hello模块(from hello import hello)后,hello模块的目录下生成了子目录 pycache, 里面包含两个 .pyc文件:
● __init__.cpython-311.pyc
● hello.cpython-311.pyc
再次好奇: Python 标准库的 .pyc 文件在哪里?
上一步我们看到,第一次导入 hello 模块后生成了 hello.cpython-311.pyc文件,其中 hello是模块名字。 那么显然, Python 标准库,比如 os, 应该有一个对应的 os.cpython-311.pyc文件。找找看?
cd /Users/zz/soft/miniconda3
find . -name "os.cpython-311.pyc"
进一步好奇:为什么 numpy 的 .pyc 出现了多次?
大概是为了缓存优化:
结论
对于自己写的 Python 模块,当它第一次被导入,就会在模块目录下生成 __pycache__目录,存放各个文件的 .pyc字节缓存文件。
而 Python 标准库、numpy等常见库,在安装的时候, 会顺带提供 .pyc文件,并且可能有多份。
Reference
file:///Users/zz/Documents/pydoc-zh-cn/python-3.12.5-docs-html/glossary.html#glossary