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

时间:2015-03-11 15:39:05

标签: python python-3.x python-3.4 delete-file

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

12 个答案:

答案 0 :(得分:160)

您可以使用下一个命令手动执行此操作:

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

这会在当前目录中递归删除所有 * .pyc 文件和 __ pycache __ 目录。

答案 1 :(得分:64)

当我把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 .非常清理它。

答案 2 :(得分:44)

macOS&的Linux

BSD在macOS上的find实现与GNU find不同 - 这与BSD和GNU查找兼容。从使用-name和{{1>} 的全局实现开始 - 将此函数放入-o文件中:

.bashrc

然后pyclean () { find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete } 到您想要递归清理的目录,并输入cd

GNU find-only

这是一个GNU查找,只有(即Linux)解决方案,但我觉得这对正则表达式来说更好一点:

pyclean

任何平台,使用Python 3

在Windows上,您可能甚至没有pyclean () { find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete } 。但是,您可能拥有Python 3,从3.4开始具有方便的find模块:

pathlib

这会滥用列表对循环的理解,但在使用python3 -c "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]" python3 -c "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]" 时,样式是次要问题。或者,我们可以滥用(例如)python -c

__import__

批评答案

最常见的答案是:

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

这似乎效率较低,因为它使用三个进程。 find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf 采用正则表达式,因此我们不需要单独调用find。同样,它有grep,因此我们不需要单独调用-delete - 与此处的注释相反,它删除非空目录,只要他们凭借正则表达式匹配就会被清空。

来自rm手册页:

xargs
     

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

答案 3 :(得分:16)

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

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

或其更简单的形式,

find . -type d -name __pycache__ -delete

由于某种原因(我删除了文件但目录没有)对我不起作用,所以为了完整起见我包括两者。

或者,如果您在受版本控制的目录中执行此操作,则可以告诉RCS递归忽略__pycache__个文件夹。然后,在所需的时刻,只需清理所有被忽略的文件。这可能会更方便,因为清理可能比__pycache__还要多。

答案 4 :(得分:8)

我使用的命令:

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代码将为您隐藏所有__pycache__个文件夹

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

希望有帮助!

答案 5 :(得分:5)

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

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

答案 6 :(得分:4)

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

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

来自Python文档:

  

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

示例

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

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

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

答案 7 :(得分:1)

非常感谢其他答案,基于它们,这就是我用于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 :(得分:1)

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

删除所有 .pyc 文件

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

删除所有 .pyo 文件:

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

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

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

如果遇到权限被拒绝错误,请在上述所有命令的开头添加 sudo

答案 9 :(得分:0)

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

答案 10 :(得分:0)

使用PyCharm

要删除Python编译文件

  1. Project Tool Window中,右键单击应从其中删除Python编译文件的项目或目录。

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

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

答案 11 :(得分:-7)

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

$rm __pycache__

它将被删除。