__pycache__是Python解释器自动创建的字节码缓存目录,用于加速模块导入——首次import时编译.py为.pyc并存入该目录,后续直接加载,避免重复编译;其生成与IDE无关,仅取决于是否发生模块加载。

__pycache__ 是 Python 解释器自动创建的,不是 IDE 或编辑器行为
它出现的唯一原因:Python 解释器在导入模块(import)或执行脚本时,触发了字节码编译流程。PyCharm、VS Code、终端里运行 python main.py,只要底层调用了 CPython 解释器,就可能生成 __pycache__ —— 和你用什么编辑器无关,只和“是否发生了模块加载”有关。
常见误解是“PyCharm 自己建的”,其实 PyCharm 只是调用了 python 命令;真正干活的是解释器本身。你换用 venv、conda 或系统 Python,只要版本一致,__pycache__ 的生成逻辑完全一样。
为什么只在某些目录下出现,而不是每个 .py 文件旁都有?
__pycache__ 目录只出现在**被 import 的模块所在目录**,而非直接执行的脚本目录(除非该脚本也被其他模块 import)。比如:
- 执行
python app.py→app.py所在目录通常不生成app.cpython-312.pyc(因为它是__main__,不走缓存路径) - 但若
app.py中写了from utils import helper,且utils.py在同级目录 →utils.py会被编译,__pycache__/utils.cpython-312.pyc就出现在当前目录 - 如果
utils是个包(含__init__.py),那__pycache__会出现在utils/内部,而不是外层项目根目录
文件名里的 cpython-312 是什么?能跨 Python 版本复用吗?
utils.cpython-312.pyc 这类名字不是随意拼的:cpython 表示解释器实现(CPython,非 PyPy/Jython),312 是主次版本号(Python 3.12),.pyc 是字节码格式标识。
这意味着:
-
__pycache__/xxx.cpython-311.pyc在 Python 3.12 下无法加载,会报错Bad magic number - 不同 minor 版本(如 3.12.0 vs 3.12.1)一般兼容,但官方不保证;major/minor 变更必然不兼容
- 删除
__pycache__后重新运行,解释器会按当前 Python 版本重建对应命名的 .pyc 文件
禁用 __pycache__ 的三种方式,各自影响范围不同
禁用本质是让解释器跳过字节码写入磁盘,但**不影响编译动作本身**(内存中仍会生成字节码用于执行):
- 单脚本临时禁用:运行时加
-B参数,如python -B main.py→ 只对该次执行生效 - 项目级控制:在 PyCharm 的 Run Configuration → Interpreter options 里填
-B→ 仅对该配置的脚本有效 - 全局禁用:设置环境变量
PYTHONDONTWRITEBYTECODE=1(Linux/macOS 加到~/.bashrc或~/.zshrc;Windows 在系统属性→环境变量里添加)→ 所有通过该环境启动的 Python 进程都不写 .pyc
注意:PYTHONDONTWRITEBYTECODE 不影响 sys.dont_write_bytecode 的运行时读取,也不阻止 compile() 等手动编译操作。
真正容易被忽略的是:即使禁用了 __pycache__,Python 模块导入速度仍依赖 sys.modules 缓存;而字节码缓存只是磁盘层面的加速,对已加载模块无影响。如果你的项目频繁重启、冷启动多,保留 __pycache__ 仍有实际价值。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











