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


166

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

Answers:


239

您可以使用下一条命令手动进行操作:

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

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


8
该命令很脏。它还会删除*__pycache__*.pyc*并且不会区分文件和目录。大多数生成的rm命令也将是多余的。
ivan_pozdeev

12
这是错误的。那不是您使用的方式,find也不greprm,也不是,这对于任何可能包含useful.pycle.jsonimportant_deployment_setting_about__pycache__.txt等的当前工作目录可能都是危险的。我不排除SO的整个用户基础。更不用说名称中带有空格的文件怎么会(危险地rm -rf)损坏xargs。所以我编辑了它
dlamblin

@dwanderson我认为您在谈论一个不同的答案;还是SO编辑历史记录不再显示完整的历史记录EG,2017年有一个未显示的版本?
dlamblin

2
在OSX不起作用grep: parentheses not balanced
丹尼尔W.

85

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


6
py3clean比@ V.Gamula的命令更为保守:它不会删除从此后已删除的源文件生成的.pyc文件。
杰罗姆

1
截至2017年5月,在macos / homebrew中,我不得不使用pip的pycleaner软件包,执行该命令的命令是pycleaner。仅限于Python 2。
Willian Mitsuda'5

3
python3-minimal似乎仅在Debian上可用(在RHEL,CentOS,brew,MacOS上
找不到

1
奇怪的是,我安装的py3clean(3.5.1-3)实际上什么也不做,不清除这些文件,而只是默默地返回(python 3.6.5)。
matanster

4
它不会删除__pycache__文件夹,也不会删除.pyc文件(已在debian上测试)
EricLavault

82

macOS和Linux

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

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

然后cd到您要递归清理的目录,然后键入pyclean

GNU仅查找

这是GNU唯一的解决方案(即Linux)解决方案,但是我觉得使用regex会更好一些:

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流程)。


您可以通过shutil.rmtee__pycache__目录上使用而不是先清空它们来将python版本提高到一行。单线可能是一个简单别名的好方法。Path不过,我现在很喜欢,所以我认为我会在脚本中使用该版本。
内森

25

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

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

或更简单的形式

find . -type d -name __pycache__ -delete

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


另外,如果在受版本控制的目录中执行此操作,则可以告诉RCS __pycache__递归忽略文件夹。然后,在需要的时刻,只需清理所有被忽略的文件。这可能会更方便,因为可能需要清理的不仅仅是余地__pycache__


不,并非所有.pyc文件都在其中。
Martin Thoma

@ V.Gamula这是一个安全得多的命令,比〜114个人幸运的是,他们并没有永久删除错误的比赛而咬他们。
dlamblin

@MartinThoma在仅python3项目中?
dlamblin

4
我是这里唯一Directory not empty使用第二种变体的人吗?
matanster

13

这是我的别名,可与Python 2和Python 3一起使用,.pyc .pyo__pycache__递归方式删除所有文件以及目录。

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

非常感谢。它帮助我摆脱了所有不必要的存储库文件。
严厉的阿加瓦尔

13

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

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

从Python文档中:

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

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

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

Python不会__pycache__在您的项目目录中创建烦人的目录,而是将所有这些目录放在~/.cache/cpython/


4
谢天谢地,这来了。该pycache垃圾目录是一个错误。
莎拉·G

7

我使用的命令:

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
}

希望能帮助到你 !!!


4

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

删除所有.pyc文件

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

删除所有.pyo文件:

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

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

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

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


3

使用PyCharm

删除Python编译文件

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

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

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


2

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

0

为什么不只是使用rm -rf __pycache__git add -A然后运行以将其从存储库中删除,然后添加__pycache__/到您的.gitignore文件中。


1
他不是手动执行此操作。他正在尝试将其添加到Debian软件包中使用的脚本中。Debian软件包不与git一起使用,而是与debian软件包管理器或apt安装程序一起使用。
克雷格

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.