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

305

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

18个回答

426

你可以使用下面的命令手动完成:

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

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


22
这个命令很粗暴。它会删除 *__pycache__*.pyc*,且不区分文件和目录。大部分生成的 rm 命令也是多余的。 - ivan_pozdeev
45
这是错误的。这不是如何使用findgreprm命令的正确方式,这可能会对任何包含useful.pycle.jsonimportant_deployment_setting_about__pycache__.txt等文件的当前工作目录造成危险。我不能排除SO整个用户群体中有这样的情况。更不用说如果文件名中有空格,那么(rm -rf命令)将会非常危险,可能会导致xargs命令出现故障。因此我进行了编辑... - dlamblin
2
在OSX上无法工作 grep: parentheses not balanced - Daniel W.
3
这个命令不安全。在执行此命令之前,请确保你已经进入了Python虚拟环境,并且知道自己要做什么。如果你在虚拟环境中执行此命令,它将会删除整个虚拟环境中的 .pyc 文件。 - Akhil S
1
@Gulzar它仍然不能区分文件和目录。 - ivan_pozdeev
显示剩余5条评论

172

macOS & Linux

在 macOS 上,BSD 版的 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查找-only(即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进程)。


你可以使用 shutil.rmtee__pycache__ 目录中而不是首先将其清空,从而将 Python 版本简化为一行。一个一行的命令可能会成为一个简单别名的好选择。虽然我现在非常喜欢 Path,但我认为我会在我的脚本中使用那个版本。 - Nathan
2
- alercelik
由于某种原因,在Makefile中,即使明确将SHELL设置为bash,在macOS上使用find命令的-delete标志似乎对我无效。但是通过管道传输到xargs以进行删除却可以正常工作。不太确定这是怎么回事。 - Taylor D. Edmiston
对于PowerShell用户,可以使用以下命令:Get-ChildItem -Recurse | where {$_.name -Match '__pycache__'} | Remove-Item -Force -Recurse - Pranithan T.

125

当我将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 . 整理得非常好。


11
py3clean比@V.Gamula的命令更为保守:它不会删除已经被删除但产生.pyc文件的源文件。 - Jérôme
1
截至2017年5月,在macOS/Homebrew中,我必须使用来自pip的包pycleaner,并且执行它的命令是pycleaner。仅适用于Python 2。 - Willian Mitsuda
3
Python3-minimal似乎只在Debian上可用(在RHEL、CentOS、brew和MacOS上找不到它)。 - user12345
1
说实话,我的安装的py3clean(3.5.1-3)实际上什么都没做,没有清除任何这些文件,只是默默地返回(Python 3.6.5)。 - matanster
这似乎只在特定名称下可用的可执行文件上运行。这不是一个通用解决方案,更像是Debian / Ubuntu专用的。 - Daniel W.
11
它不会删除__pycache__文件夹,也不会删除.pyc文件(在debian上测试过)。 - EricLavault

50

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

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

或其简化形式,

find . -type d -name __pycache__ -delete

由于某些原因(文件已被删除但目录未被删除),该方法对我无效,因此为了完整性,我将两种方法都包含在内。


或者,如果您正在进行的目录处于版本控制之下,您可以告诉版本控制系统递归地忽略 __pycache__ 文件夹。然后,在需要的时候,只需清理所有被忽略的文件。这可能更方便,因为需要清理的内容可能不仅仅是 __pycache__


不是所有的.pyc文件都在里面。 - Martin Thoma
1
@V.Gamula 这个命令比那个误删了114个文件的命令更加安全。 - dlamblin
@MartinThoma 在一个仅使用Python3的项目中? - dlamblin
10
我是唯一一个在这里使用第二种变体时遇到“目录非空”的人吗? - matanster
1
找到./目录下的所有以.py为扩展名的文件,并删除它们,同时打印出被删除的文件路径。然后再找到./目录下所有名字为__pycache__的子目录,并将其删除,同时打印出被删除的目录路径。 - nvd

48

如果您需要一个永久的解决方案来使Python缓存文件不出现在项目目录中:

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

根据Python文档:

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

示例

如果您在Linux上的~/.profile shell配置文件中添加以下行:

export PYTHONPYCACHEPREFIX="${HOME}/.cache/Python"

Python不会在你的项目目录下创建令人讨厌的__pycache__目录;相反,它会将所有这些目录放置在~/.cache/Python下。

如果你使用Linux和macOS,可以将以下代码添加到~/.bash_profile / ~/.profile中,以进行跨平台的Shell配置(同时根据需要创建文件夹):

# set python cache folder for .pyc files:
#   https://dev59.com/3l4b5IYBdhLWcg3wiSLV#57415054
case "${OSTYPE}" in
    darwin*)
        folder="${HOME}/Library/Caches/Python"
        if [[ ! -d "${folder}" ]]; then mkdir -p "${folder}"; fi
        export PYTHONPYCACHEPREFIX="${folder}"
        ;;
    linux-*)
        folder="${HOME}/.cache/Python"
        if [[ ! -d "${folder}" ]]; then mkdir -p "${folder}"; fi
        export PYTHONPYCACHEPREFIX="${folder}"
        ;;
    *)
        printf "WARNING: unsupported operating system '%s'; "`
              `'not setting PYTHONPYCACHEPREFIX' "${OSTYPE}" >&2
        return 1
        ;;
esac

11
谢天谢地这个功能终于来了。__pycache__垃圾目录是一个失误。 - Sarah G
是的,这是一个很棒的功能!所有操作系统发行版都应该默认启用它。例如,在 /etc/environment 中添加 PYTHONPYCACHEPREFIX=/var/cache/python - Keelung
3
@Keelung:我不确定是否建议使用系统范围的文件夹,例如/var/cache:这可能会与系统上其他用户的缓存冲突 - 特别是在配置此项时在“分发级别”上(即将该设置作为所有用户的默认设置)。 - ssc

28

我使用的命令:

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
}

希望它有所帮助!!!


1
谢谢这个命令 "ind . -type d -name "pycache" -exec rm -r {} +",它对我很有用。我一直在寻找一种简单的方法来删除我的 Django 项目中所有的 pycache 文件夹。 - Joshua Edward

25

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

pip3 install pyclean
pyclean .

我想强调的是,由于我看到有很多回答都涉及bash脚本编写,所以在软件开发中,最好采用经过测试的解决方案来解决问题(这正是一个成熟的Python包所代表的),而不是自己编写的解决方案。


假设已经建立的Python包已经测试了所有可能的情况... - jtlz2
1
那似乎是不可能的。在解决问题时进行选择也是已经确立的惯例。如果您的用例确实不受常见解决方案的支持,当然有意义解决您独特的用例。在这种情况下,可能会有其他人遇到相同的问题,您的解决方案应该被发布。 - Hebron Watson

13

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

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

非常感谢。这帮我清理了存储库中所有不必要的文件。 - Chetan Goyal

12

有一个不错的pip软件包。

pip install pyclean
pyclean --verbose .

完成


8

在项目目录中输入以下命令:

删除所有.pyc文件:

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

删除所有.pyo文件:

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

最后,要删除所有'__pycache__'目录,请输入以下命令:

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

如果您遇到permission denied错误,请在以上所有命令前添加sudo


最好在“-delete”后面加上“-print”。 - nvd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接