Python3 项目删除 __pycache__ 文件夹和 .pyc 文件

Posted

技术标签:

【中文标题】Python3 项目删除 __pycache__ 文件夹和 .pyc 文件【英文标题】:Python3 project remove __pycache__ folders and .pyc files 【发布时间】:2015-05-13 12:03:04 【问题描述】:

从 python3 项目中清除所有 __pycache__ 文件夹和 .pyc/.pyo 文件的最佳方法是什么。我看到多个用户建议使用 Debian 捆绑的 pyclean 脚本,但这不会删除文件夹。在将文件推送到我的 DVS 之前,我想要一种简单的方法来清理项目。

【问题讨论】:

【参考方案1】:

当我将 pyclean 错误输入为 pycclean 时,我自己找到了答案:

    No command 'pycclean' found, did you mean:
     Command 'py3clean' from package 'python3-minimal' (main)
     Command 'pyclean' from package 'python-minimal' (main)
    pycclean: command not found

运行py3clean . 清理得非常好。

【讨论】:

py3clean 比@V.Gamula 的命令更保守:它不会删除从已删除的源文件生成的 .pyc 文件。 截至 2017 年 5 月,在 macos/homebrew 中,我不得不使用 pip 中的包 pycleaner,执行它的命令是 pycleaner。仅限 Python 2。 python3-minimal 似乎仅在 Debian 上可用(在 RHEL、CentOS、brew、MacOS 上找不到) 奇怪的是,我安装的 py3clean (3.5.1-3) 实际上什么也没做,没有清除这些文件,只是默默地返回(python 3.6.5)。 它不会删除__pycache__文件夹,也不会删除.pyc文件(在debian上测试)【参考方案2】:

您可以使用下一条命令手动完成:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

这将递归删除当前目录中的所有 *.pyc 文件和 __pycache__ 目录。

【讨论】:

命令脏了。它还会删除*__pycache__*.pyc*,并且不区分文件和目录。大多数生成的rm 命令也将是多余的。 这是错误的。这不是您使用findgreprm 的方式,并且对于可能包含useful.pycle.jsonimportant_deployment_setting_about__pycache__.txt 等的任何当前工作目录都可能是危险的。我不会排除整个用户群所以。更不用说(危险的rm -rf)如何破坏xargs 将被名称中带有空格的文件所破坏。所以我编辑了它…… @dwanderson 我认为您在谈论不同的答案;还是 SO 编辑历史不再显示完整的历史 EG 2017 年有一个版本没有显示在那里? 不适用于 OSX grep: parentheses not balanced 此命令不安全。确定你要在这里做什么,如果你在 python 虚拟环境中并且如果你执行这个命令,它也会删除虚拟环境中的整个 .pyc。【参考方案3】:

macOS 和 Linux

BSD 在 macOS 上的 find 实现与 GNU find 不同 - 这与 BSD 和 GNU find 兼容。从全局实现开始,使用-name-o 表示 - 将此函数放入您的.bashrc 文件中:

pyclean () 
    find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete

然后cd 到你要递归清理的目录,然后输入pyclean

GNU 仅查找

这是一个 GNU find, only (i.e. Linux) 解决方案,但我觉得正则表达式更好一点:

pyclean () 
    find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete

任何平台,使用 Python 3

在 Windows 上,您可能甚至没有 find。但是,您可能拥有 Python 3,它从 3.4 开始具有方便的 pathlib 模块:

python3 -Bc "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
python3 -Bc "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"

-B 标志告诉 Python 不要写入 .pyc 文件。 (另请参阅PYTHONDONTWRITEBYTECODE 环境变量。)

上述滥用列表推导来循环,但是当使用python -c 时,样式是次要的问题。或者我们可以滥用(例如)__import__:

python3 -Bc "for p in __import__('pathlib').Path('.').rglob('*.py[co]'): p.unlink()"
python3 -Bc "for p in __import__('pathlib').Path('.').rglob('__pycache__'): p.rmdir()"

对答案的批评

上面的回答常说:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

这似乎效率较低,因为它使用三个进程。 find 采用正则表达式,因此我们不需要单独调用 grep。类似地,它有-delete,所以我们不需要单独调用rm——与这里的评论相反,它删除非空目录,只要它们被清空正则表达式匹配的优点。

来自xargs 手册页:

find /tmp -depth -name core -type f -delete

在 /tmp 目录下或目录下找到名为 core 的文件并删除它们, 但比前面的例子更有效(因为我们避免 需要使用 fork(2) 和 exec(2) 来启动 rm 而我们不需要 额外的 xargs 进程)。

【讨论】:

您可以通过在__pycache__ 目录上使用shutil.rmtee 而不是先清空它们,从而将python 版本变为一行;一个简单的别名可能会很好。不过,我现在是Path 的忠实粉丝,所以我想我会在我的脚本中使用那个版本。 python -Bc "import pathlib; import shutil; [shutil.rmtree(p) for p in pathlib.Path('.').rglob('__pycache__')]" 由于某种原因,find 上的 -delete 标志似乎对我在 Makefile 内部的 macOS 上不起作用,即使将 SHELL 明确设置为 bash 也是如此。但是管道到 xargs 删除工作正常。不太清楚那是关于什么的。【参考方案4】:

由于这是一个 Python 3 项目,您只需删除 __pycache__ 目录 -- 所有 .pyc/.pyo 文件都在其中。

find . -type d -name __pycache__ -exec rm -r  \+

或其更简单的形式,

find . -type d -name __pycache__ -delete

由于某种原因对我不起作用(文件已删除但目录未删除),因此为了完整起见,我将两者都包括在内。


或者,如果您在受修订控制的目录中执行此操作,您可以告诉 RCS 以递归方式忽略 __pycache__ 文件夹。然后,在需要的时候,只需清理所有被忽略的文件。这可能会更方便,因为除了__pycache__ 之外,可能还有更多需要清理的内容。

【讨论】:

不,不是所有的.pyc 文件都在里面。 @V.Gamula 这是一个比大约 114 人幸运地没有永久删除错误匹配而咬他们的命令安全得多。 @MartinThoma 在仅 python3 的项目中? 我是唯一一个获得Directory not empty 的第二个变体吗? find ./ -type f -name '*.pyc' -delete -print && find ./ -type d -name "pycache" -delete -print跨度> 【参考方案5】:

为什么不直接使用rm -rf __pycache__?之后运行git add -A 将它们从您的存储库中删除,并将__pycache__/ 添加到您的.gitignore 文件中。

【讨论】:

他没有手动执行此操作。他正试图将它添加到 Debian 软件包中使用的脚本中。 debian 包不与 git 一起使用,而是与 debian 包管理器或 apt 安装程序一起使用。【参考方案6】:

这是我的别名,适用于 Python 2 和 Python 3,以递归方式删除所有 .pyc .pyo 文件以及 __pycache__ 目录。

alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf  +'

【讨论】:

非常感谢。它帮助我为我的存储库摆脱了所有不必要的文件。【参考方案7】:

非常感谢其他答案,基于它们,这是我用于我的 Debian 软件包的 prerm 文件的内容:

#!/bin/sh
set -e

deb_package='package-name'
python_package='package_name'

if which pyclean >/dev/null 2>&1; then
    py3clean -p $deb_package
else
    dpkg -L $deb_package | grep $python_package$ | while read file
    do
        find $file -type d -name __pycache__ -exec rm -r  \+
    done
fi

【讨论】:

【参考方案8】:

使用 PyCharm

删除 Python 编译文件

    Project Tool Window 中,右键单击一个项目或目录,Python 编译文件应从中删除。

    在上下文菜单中,选择Clean Python compiled files

位于所选目录中的.pyc 文件将被静默删除。

【讨论】:

【参考方案9】:

如果您需要永久解决方案将 Python 缓存文件保留在项目目录之外:

Python 3.8 开始,您可以使用环境变量 PYTHONPYCACHEPREFIX 为 Python 定义缓存目录。

来自 Python 文档:

如果设置了此项,Python 会将 .pyc 文件写入此路径的镜像目录树中,而不是源树中的 pycache 目录中。这相当于指定 -X pycache_prefix=PATH 选项。

示例

如果您在 Linux 中将以下行添加到您的 ./profile

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"

Python 不会在您的项目目录中创建烦人的 __pycache__ 目录,而是将它们全部放在 ~/.cache/cpython/

【讨论】:

谢天谢地,这即将到来。 pycache 垃圾目录是个错误。【参考方案10】:

请转到您的终端然后输入:

$rm __pycache__

它将被删除。

【讨论】:

你的意思是,如果有人有成千上万的 pycache 文件夹在 python 项目周围浮动,那么他可以采用你的方法,这会很好吗?提问者希望自动执行此任务,因此如果您可以提供一个自动执行清理的脚本,将会很有帮助。谢谢!【参考方案11】:

在项目目录中输入以下内容:

删除所有 .pyc 文件

find . -path "*/*.pyc" -delete

删除所有 .pyo 文件:

find . -path "*/*.pyo" -delete

最后,要删除所有 '__pycache__',请输入:

find . -path "*/__pycache__" -type d -exec rm -r ';'

如果遇到 permission denied 错误,请在上述所有命令的开头添加 sudo

【讨论】:

最好在“-delete”之后加上“-print”。【参考方案12】:

我用过的命令:

find . -type d -name "__pycache__" -exec rm -r +

解释:

    首先查找当前目录下的所有__pycache__文件夹。

    执行rm -r + 删除上述步骤中的每个文件夹( 表示占位符,+ 表示结束命令)

编辑 1:

我正在使用 Linux,为了重用我在~/.bashrc 文件中添加了以下行的命令

alias rm-pycache='find . -type d -name  "__pycache__" -exec rm -r  +'

编辑 2: 如果您使用 VS Code,则无需手动删除 __pycache__。 您可以将下面的 sn-p 添加到 settings.json 文件中。之后,VS Code会为你隐藏所有__pycache__文件夹

"files.exclude": 
     "**/__pycache__": true

希望对你有帮助!!!

【讨论】:

【参考方案13】:

尽可能简单

#!/bin/bash

project_root_dir=$(pwd)

# 
# function _dcache deletes __pycache__ folders floating around python modules
# 
function _dcache() 
  find "$project_root_dir/inb" -name "__pycache__" > pycache

  while IFS= read -r cache_file; do
    rm -r $cache_file
  done < pycache

  rm pycache

这是我在项目中使用的。你可以试试看。

【讨论】:

你考虑过“pyclean”pip 包吗?它完成了这项工作,并且可能涵盖了该脚本无法涵盖的边缘情况。【参考方案14】:

先清空目录,然后删除它们:

find ./ -type f -name '*.pyc' -delete -print && find ./ -type d -name '__pycache__' -delete -print

【讨论】:

【参考方案15】:

有一个不错的 pip 包。

pip install pyclean
pyclean --verbose .

完成

【讨论】:

【参考方案16】:

我在 Mac 上运行 Python3 和 pip3。对我来说,解决方案如下 (在我项目的根目录下):

pip3 install pyclean
pyclean .

我想强调一下,因为我看到 许多 答案涉及 bash 脚本,所以软件中的最佳实践是支持经过测试的问题解决方案(这正是已建立的 python 包所代表的)采用手动方式。

【讨论】:

以上是关于Python3 项目删除 __pycache__ 文件夹和 .pyc 文件的主要内容,如果未能解决你的问题,请参考以下文章

《Python开发 - Python杂记》Python项目删除__pycache__文件夹

小知识点如何在 git 中取消 __pycache__ 文件

小知识点如何在 git 中取消 __pycache__ 文件

sh 这将删除所有.pyc和.pyo文件以及__pycache__目录。它也非常快。请参阅http://stackoverflow.com/questions/785519/how-do

python3-模拟ATM_shopping

为啥 Git 忽略不适用于 __pycache__ 文件夹? [复制]