Python 什么是pycache?

Python 什么是pycache?,python,python-3.x,caching,Python,Python 3.x,Caching,据我所知,缓存是类似文件的加密文件 我们如何处理\uuuu pycache\uuuu文件夹?这是我们给人们的东西而不是我们的源代码吗?这只是我的输入数据吗?不断创建此文件夹,它的用途是什么 在python中运行程序时,解释器首先将其编译为字节码(这是一种过于简化的做法),并将其存储在\uuuuuupycache\uuuuuu文件夹中。如果您查看那里,您会发现在项目文件夹中有一堆文件共享.py文件的名称,只有它们的扩展名是.pyc或.pyo。它们分别是程序文件的字节码编译版本和优化字节码编译版本

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


我们如何处理
\uuuu pycache\uuuu
文件夹?这是我们给人们的东西而不是我们的源代码吗?这只是我的输入数据吗?不断创建此文件夹,它的用途是什么

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

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

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

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

python -B foo.py

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

\uuu pycache\uuu
是一个文件夹,其中包含编译并准备执行的python 3字节码

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

Python程序员通常忽略字节码。实际上,在
.gitignore
文件中可以看到
\uuuuupycache\uuuuu
*.pyc
这两行代码。字节码不用于分发,可以使用进行反汇编


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

find . -name '__pycache__' -exec chflags hidden {} \;
用Python 2的
*.pyc
替换
\uuuu pycache\uuuu

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

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


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

这与使用右键单击>隐藏查看项目隐藏文件夹相同


运行单元测试是一种场景(更多注释),其中删除
*.pyc
文件和
\uuuupycache\uuuuu
文件夹确实很有用。我在我的
~/.bash_配置文件中使用以下行
,并在需要时运行
cl
进行清理

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

# pip install pyclean
pyclean .

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

更新了3.7+文档中的答案:

为了加速加载模块,Python缓存编译后的 名称下的
\uuuu pycache\uuuu
目录中的每个模块
module.version.pyc
,其中版本对 编译文件;它通常包含Python版本号。对于 例如,在CPython 3.3版中,spam.py的编译版本 被缓存为
\uuuu pycache\uuuu/spam.cpython-33.pyc
。这个命名约定 允许从不同版本和不同版本编译模块 让Python共存

资料来源:

也就是说,这个目录是由Python生成的,它的存在是为了让程序运行得更快。它不应该致力于源代码控制,应该与本地源代码和平共处



\uuuu pycache\uuuu
是一个目录,其中包含由python自动生成的字节码缓存文件,即编译的python或
.pyc
文件。您可能想知道为什么Python,一种“解释”语言,有任何编译文件。解决了这个问题(这绝对值得一读)

python文档更深入地介绍了它是如何工作的以及它存在的原因:

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

当您使用以下行时,会创建一个
\uuuuuuuuuuuuuuuupycache\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

import file_name

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

python解释器编译*.py脚本文件,并将编译结果保存到
\uuuupycache\uucode>目录

再次执行项目时,如果解释器确定*.py脚本未被修改,它将跳过编译步骤,并运行先前生成的*.pyc文件,该文件存储在
\uuuuuuuupycache\uuuu
文件夹中

当项目复杂时,可以缩短项目运行前的准备时间。如果程序太小,您可以使用
python-abc.py
B
opti忽略它
import file_name
alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$
import file_name