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


当前回答

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

其他回答

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

使用PyCharm

删除Python编译文件

在项目工具窗口中,右键单击需要删除Python编译文件的项目或目录。 在上下文菜单上,选择Clean Python已编译文件。

所选目录下的.pyc文件将被静默删除。

我使用的命令:

找到。-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__。 您可以将下面的代码片段添加到设置中。json文件。之后,VS Code会为你隐藏所有__pycache__文件夹

"files.exclude": {
     "**/__pycache__": true
}

希望能有所帮助!!

你可以用下面的命令手动完成:

find . | grep -E "(/__pycache__$|\.pyc$|\.pyo$)" | xargs rm -rf

这将从当前目录开始递归地删除所有.pyc和.pyo文件以及__pycache__目录。

有一个不错的pip包。

pip install pyclean
pyclean --verbose .

done