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

从python3项目中清除所有__pycache__文件夹和.pyc/.pyo文件的最佳方法是什么?我见过很多用户建议将pyclean脚本与Debian绑定,但这并没有删除文件夹。在将文件推送到分布式交换机之前,我想要一个简单的方法来清理项目。

246758 次浏览

当我把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的find, only(即Linux)解决方案,但我觉得它与regex更好一点:

pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}

任何平台,使用python3

在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进程)

因为这是一个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中,右键单击要删除Python编译文件的项目或目录。

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

位于选定目录中的.pyc文件将被静默删除。

如果你需要一个永久的解决方案来保持Python缓存文件不在你的项目目录中:

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

来自Python文档:

如果设置了该值,Python将在镜像目录树的此路径下写入.pyc文件,而不是在源目录树的__pycache__目录中。这等价于指定__abc2选项。

例子

如果你在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://stackoverflow.com/a/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

请到你的终端然后输入:

$rm __pycache__

它将被移除。

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

删除所有.pyc文件

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

删除所有.pyo文件:

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

最后,要删除所有“__pycache__”,输入:

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

如果遇到没有权限错误,在上述所有命令的开头添加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代码,你不需要手动删除__pycache__。 您可以将下面的代码片段添加到settings.json文件中。之后,VS代码将为你隐藏所有__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 .

完成

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

pip3 install pyclean
pyclean .

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

大多数时候你的项目都在源代码控制之下;如果使用了git,可以只运行git clean -d -f .来清理非版本控制的文件;如果Python缓存文件/目录在.gitignore中,你还需要-x(也删除被忽略的文件)或-X(只删除被忽略的文件)命令行开关。

请注意,如果你有任何临时文件必须保存,在没有-X的情况下运行git clean之前,将它们移到本地存储库之外或添加到索引树。