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

Python3 project remove __pycache__ folders and .pyc files

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

当我将 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 . 清理得很好

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

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

这将从当前目录开始递归地删除所有 .pyc.pyo 文件以及 __pycache__ 目录。

macOS & Linux

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

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

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

GNU 仅查找

这是一个 GNU 发现的,唯一的(即 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 flag tells Python not to write .pyc files. (See also the 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

Find files named core in or below the directory /tmp and delete them, but more efficiently than in the previous example (because we avoid the need to use fork(2) and exec(2) to launch rm and we don't need the extra xargs process).

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

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

或其更简单的形式,

find . -type d -name __pycache__ -delete

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


或者,如果您在受修订控制的目录中执行此操作,您可以告诉 RCS 递归地忽略 __pycache__ 文件夹。然后,在需要的时候,清理所有被忽略的文件。这可能会更方便,因为可能需要清理的不仅仅是 __pycache__.

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

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

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

非常感谢其他答案,基于他们,这就是我用于我的 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

使用PyCharm

删除Python个编译文件

  1. Project Tool Window、right-click一个项目或目录中,Python个编译文件应该被删除。

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

驻留在所选目录中的 .pyc 个文件被静默删除。

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

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

来自 Python 文档:

If this is set, Python will write .pyc files in a mirror directory tree at this path, instead of in pycache directories within the source tree. This is equivalent to specifying the -X pycache_prefix=PATH option.

例子

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

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

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

请前往您的终端,然后输入:

$rm __pycache__

它将被删除。

从项目目录中键入以下内容:

正在删除所有 .pyc 文件

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

正在删除所有 .pyo 文件:

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

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

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

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

我用过的命令:

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

解释:

  1. 首先找到当前目录下的所有__pycache__个文件夹。

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

已编辑 1:

我正在使用 Linux,以重复使用我已将以下行添加到 ~/.bashrc 文件的命令

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

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

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

希望对您有所帮助!!!

越简单越好

#!/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
}

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

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

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

有一个不错的 pip 包。

pip install pyclean
pyclean --verbose .

完成

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

pip3 install pyclean
pyclean .

我想强调一下,因为我看到 很多 答案涉及 bash 脚本,在软件中最好的做法是支持经过测试的问题解决方案(这正是已建立的 python 包所代表的)在手动方法上。