据我所知,缓存是一个类似文件的加密文件。
我们如何处理__pycache__
文件夹?它是我们给别人的东西,而不是我们的源代码吗?它只是我的输入数据吗?这个文件夹不断被创建,它是用来做什么的?
当你在Python中运行一个程序时,解释器首先将其编译为字节码(这是个过度简化的说法),并将其存储在__pycache__
文件夹中。如果你看一下那里,你会发现一堆与你项目文件夹中的.py文件名称相同的文件,只是它们的扩展名是.pyc或.pyo。这些文件分别是你的程序的字节码编译版和优化的字节码编译版。
作为一个程序员,你基本上可以忽略它......它所做的只是让你的程序启动得更快一点。当你的脚本发生变化时,它们将被重新编译,如果你删除这些文件或整个文件夹并再次运行你的程序,它们将重新出现(除非你特别抑制这种行为
如果你使用的是cpython(这是最常见的,因为它是参考实现),而且你不想要那个文件夹,那么你可以通过用-B标志启动解释器来抑制它,比如说
python -B foo.py
另一个选择,正如tcaswell所指出的,是将环境变量PYTHONDONTWRITEBYTECODE
设置为任何值(根据python'的man page,任何"非空字符串")。
__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 && ...'
在 3.2 和更高版本中,Python 将 .pyc 编译的字节码文件保存在一个名为 pycache__
的子目录中,该目录位于源文件所在的目录中,文件名是创建这些文件的 Python 版本 (例如 script.cpython-33.pyc)。