什么是__pycache__?

2022-09-05 01:14:59

据我所知,缓存是类似文件的加密文件。

我们如何处理该文件夹?是我们给人们的东西,而不是我们的源代码吗?它只是我的输入数据吗?这个文件夹不断被创建,它的目的是什么?__pycache__


答案 1

当您在Python中运行程序时,解释器首先将其编译为字节码(这是一种过度简化)并将其存储在文件夹中。如果您查看那里,您会发现一堆文件共享项目文件夹中文件的名称,只有它们的扩展名将是 或 。这些分别是程序文件的字节码编译和优化的字节码编译版本。__pycache__.py.pyc.pyo

作为一名程序员,你基本上可以忽略它...它所做的就是让你的程序启动得更快一点。当您的脚本更改时,它们将被重新编译,如果您删除文件或整个文件夹并再次运行程序,它们将重新出现(除非您专门禁止该行为)。

当您将代码发送给其他人时,通常的做法是删除该文件夹,但无论是否这样做并不重要。使用版本控制 () 时,此文件夹通常列在忽略文件 () 中,因此未包括在内。git.gitignore

如果您使用的是CPython(这是最常见的,因为它是参考实现),并且您不需要该文件夹,那么您可以通过使用-B标志启动解释器来禁止它,例如

python -B foo.py

另一种选择,正如tcaswell所指出的,是将环境变量设置为任何值(根据Python的手册页,任何“非空字符串”)。PYTHONDONTWRITEBYTECODE


答案 2

__pycache__是一个包含 Python 3 字节码的文件夹,该字节码已编译并准备执行

我不建议在开发过程中例行费力地删除这些文件或禁止创建,因为这会浪费你的时间。只需准备好一个递归命令(见下文)即可在需要时进行清理,因为字节码在边缘情况下可能会过时(请参阅注释)。

Python程序员通常忽略字节码。确实,并且是在文件中看到的常见行。字节码不用于分发,可以使用 dis 模块进行反汇编。__pycache__*.pyc.gitignore


如果您使用的是OS X,则可以通过从项目的根文件夹运行以下命令来轻松隐藏项目中的所有这些文件夹。

find . -name '__pycache__' -exec chflags hidden {} \;

替换为 Python 2。__pycache__*.pyc

这会在所有这些目录(.pyc 文件)上设置一个标志,告诉 Finder/Textmate 2 将它们从列表中排除。重要的是,字节码就在那里,它只是被隐藏了。

如果创建新模块并希望隐藏新字节码或删除隐藏的字节码文件,请重新运行该命令。


在 Windows 上,等效命令可能是(未经测试,欢迎使用批处理脚本):

dir * /s/b | findstr __pycache__ | attrib +h +s +r

这与使用右键单击>隐藏来浏览项目隐藏文件夹相同...


运行单元测试是删除文件和文件夹确实有用的一种方案(在注释中更多)。我在我的中使用以下行,并在需要时运行以清理。*.pyc__pycache__~/.bash_profilecl

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'

以及最近更多

# pip install pyclean
pyclean .