前言

在实际运行 Python 项目过程中时长可以看见一个名为 __pycache__
的文件夹,那么就有这几个问题了:
__pycache__
缓存了什么东西?__pycache__
的目的是什么?__pycache__
会在什么时候会产生?- 我们可以手动禁止
__pycache__
吗? - 什么样的文件会被缓存?
__pycache__
运行的机制是什么样子的?
__pycache__
的那些事
首先可以看一下官方文档对 __pycache__
的解释

上述文档可以回答最初的几个问题:
__pycache__
缓存了模块的编译版本,其命名格式为module.version.pyc
__pycache__
是为了提升加载模块的速度,并不能提升运行速度。- 模块文件会被缓存,当然就像文档提到的那样,从命令行直接载入的模块,每次都会重新编译,且不储存编译结果
至于剩下的几个问题,我们可以先看一下 PEP 3147 中的流程图
从流程图中,不难注意到,当我们引入一个模块的时候,在运行过程中,会检验在__pycache__
文件夹中是否存在对应的 pyc
文件,如果不存在则会尝试创建,所以 __pycache__
会在什么时候产生呢?当我们在运行 Python 程序的时候它就会产生。
__pycache__
的运行机制在在流程图被描述的很清楚,这里也不在过多赘述。
如果在实际过程中,我们不喜欢出现__pycache__
文件夹和pyc
文件,该如何设置呢?
只需要设置 PYTHONDONTWRITEBYTECODE
环境变量为任意非空字符串,即可避免 __pycache__
文件的生成,亦或 python -B xxx.py
。 也有 pyclean
库被用来专门删除 __pycache__
的文件的。