什么是__pycache__?

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

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

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

作为一个程序员,你基本上可以忽略它......它所做的只是让你的程序启动得更快一点。当你的脚本发生变化时,它们将被重新编译,如果你删除这些文件或整个文件夹并再次运行你的程序,它们将重新出现(除非你特别抑制这种行为

如果你使用的是cpython(这是最常见的,因为它是参考实现),而且你不想要那个文件夹,那么你可以通过用-B标志启动解释器来抑制它,比如说

python -B foo.py

另一个选择,正如tcaswell所指出的,是将环境变量PYTHONDONTWRITEBYTECODE设置为任何值(根据python'的man page,任何"非空字符串")。

评论(11)

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

我不建议在开发过程中经常删除这些文件或抑制创建,因为这可能会损害性能。只要准备好一个递归命令(见下文),在需要时进行清理,因为字节码在边缘情况下可能会变得陈旧(见注释)。

Python 程序员通常会忽略字节码。事实上,__pycache__和*.pyc是在.gitignore文件中常见的行。字节码不是用来发布的,可以用 [dis` 模块] 1 进行反汇编。


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

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

对于Python 2,用*.pyc替换`pycache

这将在所有这些目录(.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 && ...'
评论(10)

在 3.2 和更高版本中,Python 将 .pyc 编译的字节码文件保存在一个名为 pycache__ 的子目录中,该目录位于源文件所在的目录中,文件名是创建这些文件的 Python 版本 (例如 script.cpython-33.pyc)。

评论(0)