协慌网

登录 贡献 社区

什么是__pycache__?

据我了解,缓存是类似文件的加密文件。

我们如何处理__pycache__文件夹?是我们提供给人们的,而不是我们提供的源代码吗?只是我的输入数据吗?这个文件夹不断创建,它是做什么用的?

答案

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

作为程序员,您基本上可以忽略它…… 它所做的只是使您的程序启动更快。脚本更改时,将重新编译它们,如果删除文件或整个文件夹并再次运行程序,它们将重新出现(除非您明确禁止这种行为)。

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

如果您使用的是 cpython(这是最常见的实现,因为它是参考实现),并且您不想要该文件夹,则可以通过使用 - B 标志启动解释器来取消显示该文件夹。

python -B foo.py

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

__pycache__是一个文件夹,其中包含已编译并可以执行的 Python 3 字节码

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

Python 程序员通常忽略字节码。实际上__pycache__*.pyc .gitignore文件中常见的行。字节码不是用于分发的,可以使用dis module进行反汇编。


如果您使用的是 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_profile使用以下行,并在需要时cl

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

以及最近

# pip install pyclean
pyclean .

使用以下__pycache__将创建一个__pycache__文件夹:

import file_name

或尝试从您创建的另一个文件中获取信息。这使得第二次运行程序打开另一个文件时速度更快。