Python 的 __pycache__

2024-06-02
#python

前言

python __pycache__ folder

在实际运行 Python 项目过程中时长可以看见一个名为 __pycache__ 的文件夹,那么就有这几个问题了:

  1. __pycache__ 缓存了什么东西?
  2. __pycache__ 的目的是什么?
  3. __pycache__ 会在什么时候会产生?
  4. 我们可以手动禁止 __pycache__ 吗?
  5. 什么样的文件会被缓存?
  6. __pycache__ 运行的机制是什么样子的?

__pycache__ 的那些事

首先可以看一下官方文档对 __pycache__ 的解释

已编译的 Python 文件

上述文档可以回答最初的几个问题:

  1. __pycache__ 缓存了模块的编译版本,其命名格式为 module.version.pyc
  2. __pycache__ 是为了提升加载模块的速度,并不能提升运行速度
  3. 模块文件会被缓存,当然就像文档提到的那样,从命令行直接载入的模块,每次都会重新编译,且不储存编译结果

至于剩下的几个问题,我们可以先看一下 PEP 3147 中的流程图

PEP 3417 flow chat

从流程图中,不难注意到,当我们引入一个模块的时候,在运行过程中,会检验在__pycache__ 文件夹中是否存在对应的 pyc 文件,如果不存在则会尝试创建,所以 __pycache__ 会在什么时候产生呢?当我们在运行 Python 程序的时候它就会产生

__pycache__ 的运行机制在在流程图被描述的很清楚,这里也不在过多赘述。

如果在实际过程中,我们不喜欢出现__pycache__ 文件夹和pyc 文件,该如何设置呢?
只需要设置 PYTHONDONTWRITEBYTECODE 环境变量为任意非空字符串,即可避免 __pycache__ 文件的生成,亦或 python -B xxx.py 也有 pyclean 库被用来专门删除 __pycache__ 的文件的。

参考

  1. What is pycache?
  2. What Is the pycache Folder in Python?
  3. 【Python】__pycache__文件夹是什么东西?
  4. Where is my pycache folder and .pyc byte code files?