那么我们应该怎么处理
__pycache__
文件夹呢?它是我们给他人的源代码吗?还是只是我的输入数据?为什么这个文件夹总是会被创建?__pycache__
文件夹呢?它是我们给他人的源代码吗?还是只是我的输入数据?为什么这个文件夹总是会被创建?python -B foo.py
如tcaswell所指出的,另一种选择是将环境变量 PYTHONDONTWRITEBYTECODE
设置为任何值(根据Python的man页面,任何“非空字符串”均可)。
PYTHONDONTWRITEBYTECODE=<任意值>
来永久禁用它。 - Mark Tolonenpython2
会将编译后的文件放在与原始文件相同的目录中。 - scott_fakenamefind . -name '*.pyc' -delete
这个命令会查找当前目录及其子目录中所有扩展名为 .pyc
的文件并将其删除。是的,find
命令有一个标志用于删除找到的文件,因此您不必使用任何 xargs
技巧。 - vlad-ardelean__pycache__
是一个文件夹,其中包含编译好并准备执行的Python 3 字节码。
我不建议经常费力地删除这些文件或在开发过程中抑制创建,因为这会浪费你的时间。只需准备好一个递归命令(见下文),在需要清理字节码时使用,因为在某些特殊情况下字节码可能会变得陈旧(请参阅注释)。
Python 程序员通常忽略字节码。实际上,在 .gitignore
文件中看到 __pycache__
和 *.pyc
是很常见的。字节码不适用于分发,并且可以使用 dis
模块进行反汇编。
如果您正在使用OS X,则可以从项目的根目录运行以下命令,轻松隐藏项目中的所有这些文件夹。
find . -name '__pycache__' -exec chflags hidden {} \;
将 __pycache__
替换为 *.pyc
以适用于Python 2。
这将在所有这些目录(.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 && ...'
最近更多的是
# pip install pyclean
pyclean .
当你使用代码行:
__pycache__
时,会创建一个__pycache__
文件夹。
import file_name
或者尝试从您创建的另一个文件中获取信息。这会使第二次运行程序时打开其他文件更快一些。
来自3.7+文档的更新答案:
为了加快模块加载速度,Python会将每个模块的已编译版本缓存到
__pycache__
目录中,使用module.version.pyc
的名称进行标识。这里的version指的是编译文件的格式编码,通常包含Python版本号。例如,在CPython 3.3版本中,spam.py的编译版本将被缓存为__pycache__/spam.cpython-33.pyc
。此命名约定允许不同版本和不同Python版本的编译模块共存。
来源:https://docs.python.org/zh-cn/3/tutorial/modules.html#compiled-python-files
也就是说,这个目录是由Python生成的,存在的目的是加快程序的运行速度。它不应该提交到源代码控制,并且应该与本地源代码和平共处。
__pycache__
是一个包含字节码缓存文件的目录,这些文件是Python自动生成的,即编译的Python文件(.pyc
)。你可能会想知道,为什么Python(一种“解释型”语言)需要任何编译文件。这个SO问题回答了这个问题(其中这个答案绝对值得一读)。
Python文档详细介绍了它的工作原理和存在的原因:
.pyc
文件保存在同一目录下会导致许多问题,比如在不同版本的 Python 解释器中运行程序时。更多详细信息请参见PEP 3174。__pycache__/
添加到我的存储库根目录下的.gitignore
文件中,以使Git忽略所有这些自动生成的__pycache__
目录! - Gabriel Staples当你导入一个模块时,
import file_name
Python会将编译后的字节码存储在__pycache__
目录中,以便未来的导入可以直接使用它,而不必重新解析和编译源代码。
仅当文件被导入时才会这样做,运行脚本则不会。
(早期版本使用.py文件一起散落在同一个目录下的缓存字节码文件(.pyc),但从Python 3开始,它们被移动到了一个子目录中,使事情变得更加整洁。)
PYTHONDONTWRITEBYTECODE ---> 如果将其设置为非空字符串,则Python将不会在源模块导入时尝试编写.pyc文件。这相当于指定 -B选项。
file_name
是一个包含函数定义的文件,是否会有性能提升? - Anton从官方Python教程模块中:
为了加快模块的加载速度,Python会将每个模块的编译版本缓存到
__pycache__
目录下,文件名为module.version.pyc
。其中,版本号包含编译文件的格式,通常包含Python版本号。例如,在CPython 3.6版本中,spam.py的编译版本会被缓存为__pycache__/spam.cpython-36.pyc
。
来自Python文档编程FAQs:
当第一次导入模块时(或者当前编译文件创建后源文件已更改),应在
.py
文件所在目录的__pycache__
子目录中创建一个包含编译代码的.pyc
文件。.pyc
文件的文件名以与.py
文件相同的名称开头,并以.pyc
结尾,中间部分取决于创建它的特定Python二进制文件。
在 Python 2.x 版本中,解释器编译代码时会生成.pyc文件。
而在 Python 3.x 版本中,解释器编译代码时会生成__pycache__文件。
alok@alok:~$ ls
module.py module.pyc __pycache__ test.py
alok@alok:~$
__pycache__
的子目录中,该子目录位于源文件所在目录中,并且以标识创建它们的Python版本的文件名进行命名(例如script.cpython-33.pyc)。
Python 3.8
起,您可以使用一个环境变量来更改位置以避免烦人的缓存目录:https://stackoverflow.com/a/57414308/1612318。 - RotaretiPYTHONPYCACHEPREFIX
放在这里 - 有关更多信息,请参见 @Rotareti 的评论。 - bers