Answers:
您可以使用下一条命令手动进行操作:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
这将递归地删除当前目录中的所有* .pyc文件和__pycache__目录。
find
也不grep
是rm
,也不是,这对于任何可能包含useful.pycle.json
或important_deployment_setting_about__pycache__.txt
等的当前工作目录可能都是危险的。我不排除SO的整个用户基础。更不用说名称中带有空格的文件怎么会(危险地rm -rf
)损坏xargs
。所以我编辑了它
grep: parentheses not balanced
当我将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 .
清理它很好。
__pycache__
文件夹,也不会删除.pyc
文件(已在debian上测试)
BSD find
在macOS上的实现不同于GNU find-这与BSD和GNU find兼容。使用-name
和的-o
for 或 -将这个函数放入.bashrc
文件中,从全局实现开始。
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
然后cd
到您要递归清理的目录,然后键入pyclean
。
这是GNU唯一的解决方案(即Linux)解决方案,但是我觉得使用regex会更好一些:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
在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
不过,我现在很喜欢,所以我认为我会在脚本中使用该版本。
由于这是一个Python 3项目,因此您只需要删除__pycache__
目录-所有.pyc
/ .pyo
文件都在其中。
find . -type d -name __pycache__ -exec rm -r {} \+
或更简单的形式
find . -type d -name __pycache__ -delete
出于某种原因对我不起作用(文件已删除,但目录未删除),因此出于完整性考虑,我将两者都包括在内。
另外,如果在受版本控制的目录中执行此操作,则可以告诉RCS __pycache__
递归忽略文件夹。然后,在需要的时刻,只需清理所有被忽略的文件。这可能会更方便,因为可能需要清理的不仅仅是余地__pycache__
。
.pyc
文件都在其中。
Directory not empty
使用第二种变体的人吗?
这是我的别名,可与Python 2和Python 3一起使用,.pyc .pyo
以__pycache__
递归方式删除所有文件以及目录。
alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
如果需要永久解决方案以将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/
我使用的命令:
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 Code将为您隐藏所有__pycache__
文件夹
"files.exclude": {
"**/__pycache__": true
}
希望能帮助到你 !!!
非常感谢其他答案,基于这些答案,这就是我用于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
请直接到您的终端,然后输入:
$rm __pycache__
它将被删除。
*__pycache__
,*.pyc*
并且不会区分文件和目录。大多数生成的rm
命令也将是多余的。