清除python3项目中的所有__pycache__
文件夹和.pyc/.pyo
文件的最佳方法是什么?我见过多个用户建议与Debian捆绑的pyclean
脚本,但这不会删除文件夹。在将文件推送到DVS之前,我想要一种简单的方法来清理项目。
答案 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)
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查找,只有(即Linux)解决方案,但我觉得这对正则表达式来说更好一点:
pyclean
在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 {} +
说明:
首先在当前目录中找到所有__pycache__
文件夹。
在上一步执行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)
在Project Tool Window
中,右键单击应从其中删除Python编译文件的项目或目录。
在上下文菜单上,选择Clean Python compiled files
。
驻留在所选目录中的.pyc
文件被静默删除。
答案 11 :(得分:-7)
请直接转到您的终端,然后输入:
$rm __pycache__
它将被删除。