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
命令也将是多余的。
这是错误的。这不是您使用find
或grep
或rm
的方式,并且对于可能包含useful.pycle.json
或important_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