什么是__pycache__?

use*_*042 560 python caching python-3.x

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

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

sco*_*ame 450

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

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

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

python -B foo.py
Run Code Online (Sandbox Code Playgroud)

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

  • 您还可以添加环境变量"PYTHONDONTWRITEBYTECODE = <any_value>`以永久禁止它. (45认同)
  • `找到.-name'*.pyc'-delete`是的,find有一个删除找到的文件的标志,所以你不必使用任何xargs shananigans (27认同)
  • 一个重要警告是,如果缺少.py文件,将使用缓存的.pyc文件而不是.py文件.实际上,只有当你删除(或重命名)模块时才会发生这种情况,所以这不是常见的事情,但是如果有些东西不停地"存在",那么在抓住你的头后,运行find.-name\*.pyc | 你的来源上的xargs rm可能是一个很好的第一反应. (22认同)
  • @JoeJ是的,我认为这是真的.`python2`将编译后的文件放在与原件相同的目录中,如果我没弄错的话. (10认同)
  • 只是为了澄清,这仅适用于Python 3,对吗? (9认同)
  • 但是如果你需要,你仍然可以使用.pyc*代替.py:只需将它复制出`__pycache__`即可. (3认同)
  • @JoeJ确切地说,它是作为Python 3.2的一部分引入的. (2认同)
  • @ yacc143:只有当.pyc文件是.py文件所在的目录时才会发生这种情况 - 也就是说,Python 2放置它们.Python 3将它们放在`__pycache__`中,如果.py文件不存在则不使用它. (2认同)
  • 可以将这些文件夹移动到其他位置吗?我正在尝试清理我的用户名目录。 (2认同)

lin*_*eak 156

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

不要打扰删除这些文件也不要压制创建,因为它会损害性能.只需准备一个递归命令(见下文),以便在需要时进行清理,因为在边缘情况下字节码可能会变得陈旧(请参阅注释).

Python程序员通常会忽略字节码.事实上,__pycache__*.pyc有共同线看.gitignore文件.字节码不用于分发,可以使用dis模块进行拆卸.


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

find . -name '__pycache__' -exec chflags hidden {} \;
Run Code Online (Sandbox Code Playgroud)

更换__pycache__*.pyc的Python 2.

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

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


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

dir * /s/b | findstr __pycache__ | attrib +h +s +r
Run Code Online (Sandbox Code Playgroud)

这与使用右键单击>隐藏...浏览项目隐藏文件夹相同


运行单元测试是一种情况(更多在注释中),删除*.pyc文件和__pycache__文件夹确实很有用.我在我的使用中使用以下行,~/.bash_profilecl在需要时运行以进行清理.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'
Run Code Online (Sandbox Code Playgroud)

  • ***绝对**打扰删除这些*:这不是没有意义的.在很多情况下,Python很乐意不会检测到文件更改并运行缓存文件,因为"为什么f仍然无法正常工作,我更改了代码,为什么它仍然无法在不存在的调用上失败".特别是在测试框架中,pycache-by-default是最差的. (31认同)
  • 这不是一个好的答案.提问者想知道这些文件的用途.这个答案说"不要担心",然后让它们消失. (6认同)
  • @DoTheEvo:它根本没有被创建,因此下次加载模块时没有加速.没有错误提出. (2认同)
  • 我不同意“不要麻烦删除这些文件”的建议-多次看到此建议,最近一次是[肯尼思·雷茨(Kenneth Reitz)的“如何使用Python”)(http://howtopython.org/en/latest/the-interpreter /#bytecode-trick)(“字节码技巧”) (2认同)

Ale*_* S. 27

使用该行时会创建__pycache__文件夹

import file_name
Run Code Online (Sandbox Code Playgroud)

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


Flu*_*mur 21

__pycache__是一个包含由python自动生成的字节码缓存文件的目录,即编译的python或module.version.pyc文件.您可能想知道为什么Python(一种"解释"语言)根本没有任何编译文件.这个SO问题解决了这个问题(这绝对值得一读这个答案).

基本上,

  • 它使您的程序运行得更快
  • 你通常可以忽略它

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

  • 它是在python 3.2中添加的,因为__pycache__/spam.cpython-33.pyc在同一目录中维护文件的现有系统引起了各种问题,例如当程序使用不同版本的Python解释器运行时.有关完整的功能规格,请参阅PEP 3174.


Yos*_*n42 7

来自官方python教程模块

为了加快加载模块的速度,Python 将每个模块的编译版本缓存在__pycache__name 下的目录中module.version.pyc,其中版本对编译文件的格式进行编码;它通常包含 Python 版本号。例如,在 CPython 3.6 版中,spam.py 的编译版本将被缓存为__pycache__/spam.cpython-36.pyc.

来自 Python 文档编程常见问题解答

当模块第一次被导入时(或者当源文件自当前编译文件被创建以来发生了变化)时,应该在__pycache__包含该.py文件的目录的子目录中创建一个包含编译代码的 .pyc文件。该.pyc文件将有一个文件名,该.py文件名以与文件相同的名称开头,以, 结尾.pyc,中间组件取决于创建它的特定 python 二进制文件。


Alo*_*ari 6

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

Python 3.x 版本在解释器编译代码时将具有__pycache__ 。

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$
Run Code Online (Sandbox Code Playgroud)


Ehs*_*dar 6

当您导入模块

import file_name
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Mar*_*ton 5

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

当项目再次执行时,如果解释器识别出*.py脚本没有被修改,它会跳过编译步骤并运行之前生成的存储在该__pycache__文件夹中的*.pyc文件。

当项目比较复杂时,可以使项目运行前的准备时间缩短。如果程序太小,可以使用python -B abc.pywithB选项忽略它。


Tec*_*ree 5

执行 python 脚本会导致字节码在内存中生成并保留到程序关闭。在导入模块的情况下,为了更快的可重用性,Python 将创建一个缓存 .pyc(PYC 是 'Python' 'Compiled')文件,其中缓存了正在导入的模块的字节码。想法是通过在重新导入时避免重新编译(编译一次,多次运行策略)来加速python模块的加载。

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