清除所有__pycache__文件夹和.pyc/。python3项目中的Pyo文件。我见过许多用户建议将pyclean脚本与Debian捆绑在一起,但这并没有删除文件夹。在将文件推送到分布式交换机之前,我想要一个简单的方法来清理项目。
当前回答
尽可能的简单
#!/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
}
这是我在项目中使用的。你可以试试。
其他回答
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()"
对答案的批判
最常见的答案是:
找到。| grep -E "(__pycache__|\.pyc|\.pyo$)"| xargs rm -rf
这似乎效率较低,因为它使用了三个过程。Find接受正则表达式,因此不需要单独调用grep。类似地,它有-delete,所以我们不需要单独调用rm——与这里的注释相反,它将删除非空目录,只要它们通过正则表达式匹配被清空。
从xargs手册页:
查找/tmp -depth -name core -type f -delete 在/tmp目录下找到名为core的文件并删除它们 但比前面的例子更有效(因为我们避免了 需要使用fork(2)和exec(2)来启动rm,我们不需要 额外的xargs进程)。
有一个不错的pip包。
pip install pyclean
pyclean --verbose .
done
大多数时候你的项目都在源代码控制之下;如果使用git,可以直接运行git clean -d -f。清理非版本控制文件;如果Python缓存文件/目录在.gitignore中,你还需要-x(也删除被忽略的文件)或-x(只删除被忽略的文件)命令行开关。
请注意,如果你有任何临时文件需要保存,在不带-X的情况下运行git clean之前,将它们移到本地存储库之外或添加到索引树中。
先清空目录,然后删除它们:
find ./ -type f -name '*.pyc' -delete -print && find ./ -type d -name '__pycache__' -delete -print
非常感谢其他的答案,基于他们,这是我用于我的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
推荐文章
- python:将脚本工作目录更改为脚本自己的目录
- 如何以编程方式获取python.exe位置?
- 如何跳过循环中的迭代?
- 使用Pandas为字符串列中的每个值添加字符串前缀
- ImportError:没有名为matplotlib.pyplot的模块
- 在python中遍历对象属性
- 如何在Python中使用方法重载?
- 在Python中提取文件路径(目录)的一部分
- 如何安装没有根访问权限的python模块?
- 尝试模拟datetime.date.today(),但不工作
- 将行添加到数组
- 如何在Python中直接获得字典键作为变量(而不是通过从值搜索)?
- Python:为什么functools。部分有必要吗?
- 如何用python timeit对代码段进行性能测试?
- Python迭代器中的has_next ?