什么是__pycache__?

时间:2013-06-01 04:24:24

标签: python python-3.x caching

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

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

11 个答案:

答案 0 :(得分:391)

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

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

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

python -B foo.py

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

答案 1 :(得分:139)

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

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

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


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

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

__pycache__替换为{2}的*.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 && ...'

答案 2 :(得分:19)

使用

行时会创建__pycache__文件夹
import file_name

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

答案 3 :(得分:12)

__pycache__是一个包含由python自动生成的字节码缓存文件的目录,即编译的python或.pyc文件。你可能想知道为什么Python,"解释"语言,有任何编译文件。 This SO question解决了这个问题(而且它绝对值得一读this answer)。

python文档更详细地介绍了它的工作原理以及它存在的原因:

  • It was added in python 3.2因为在同一目录中维护.pyc文件的现有系统导致了各种问题,例如当程序使用不同版本的Python解释器运行时。有关完整的功能规范,请参阅PEP 3174

答案 4 :(得分:5)

导入模块时,

import file_name

Python将编译后的字节码存储在__pycache__目录中,以便将来的导入可以直接使用它,而不必再次解析和编译源代码。

仅在导入文件时,它不会仅运行脚本来执行此操作。

(以前的版本用于将缓存的字节码存储为.pyc文件,这些文件与.py文件位于同一目录中,但是从Python 3开始,它们被移到了一个子目录以使内容更整洁。)

PYTHONDONTWRITEBYTECODE --->如果将其设置为非空字符串,Python将不会尝试在导入源模块时写入.pyc文件。这等效于指定-B选项。

答案 5 :(得分:2)

python解释器编译* .py脚本文件,并将编译结果保存到__pycache__目录中。

再次执行项目时,如果解释器识别出* .py脚本未被修改,则它将跳过编译步骤并运行先前存储在__pycache__文件夹中的* .pyc文件。 / p>

当项目很复杂时,您可以缩短项目运行之前的准备时间。如果程序太小,可以通过将python -B abc.pyB选项一起使用来忽略它。

答案 6 :(得分:1)

在3.2及更高版本中,Python将.pyc编译的字节代码文件保存在名为__pycache__的子目录中,该子目录位于源文件所在的目录中,文件名标识创建它们的Python版本(例如脚本)。 CPython的-33.pyc)

答案 7 :(得分:1)

Python版本2.x在解释器编译代码时将具有 .pyc

当解释器编译代码时,Python版本3.x将具有 __ pycache __

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$

答案 8 :(得分:0)

执行python脚本将导致字节码在内存中生成并保留直到程序关闭。 如果导入了模块,则为了提高重用性,Python会创建一个缓存.pyc(PYC是“ Python”“已编译”)文件,其中将要导入的模块的字节码存储在其中。 想法是通过避免在重新导入时避免重新编译(一次编译,多次运行策略)来加快python模块的加载速度。

文件名与模块名相同。初始点后面的部分表示创建缓存的Python实现(可以是CPython),其后是版本号。

答案 9 :(得分:-1)

pycache = python的字节码编译文件

答案 10 :(得分:-1)

python interpreter compiles your code into those cached files and saves them to those folders, any time you will use

import something 

it will appear