什么是最佳的清理Python 3项目中所有 __pycache__
文件夹和 .pyc/.pyo
文件的方法?我看到很多用户建议使用Debian捆绑的pyclean
脚本,但这不会删除文件夹。我想找到简单的方法在将文件推送到我的DVS之前清理项目。
什么是最佳的清理Python 3项目中所有 __pycache__
文件夹和 .pyc/.pyo
文件的方法?我看到很多用户建议使用Debian捆绑的pyclean
脚本,但这不会删除文件夹。我想找到简单的方法在将文件推送到我的DVS之前清理项目。
你可以使用下面的命令手动完成:
find . | grep -E "(/__pycache__$|\.pyc$|\.pyo$)" | xargs rm -rf
这将递归地从当前目录开始,删除所有的.pyc
和.pyo
文件,以及__pycache__
目录。
在 macOS 上,BSD 版的 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查找-only(即Linux)解决方案,但我觉得使用正则表达式会更好:
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
,但我认为我会在我的脚本中使用那个版本。 - Nathan
- alercelikSHELL
设置为bash,在macOS上使用find
命令的-delete
标志似乎对我无效。但是通过管道传输到xargs以进行删除却可以正常工作。不太确定这是怎么回事。 - Taylor D. EdmistonGet-ChildItem -Recurse | where {$_.name -Match '__pycache__'} | Remove-Item -Force -Recurse
。 - Pranithan T.当我将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上测试过)。 - EricLavault由于这是一个Python 3项目,您只需要删除__pycache__
目录——所有的.pyc
/.pyo
文件都在里面。
find . -type d -name __pycache__ -exec rm -r {} \+
或其简化形式,
find . -type d -name __pycache__ -delete
由于某些原因(文件已被删除但目录未被删除),该方法对我无效,因此为了完整性,我将两种方法都包含在内。
或者,如果您正在进行的目录处于版本控制之下,您可以告诉版本控制系统递归地忽略 __pycache__
文件夹。然后,在需要的时候,只需清理所有被忽略的文件。这可能更方便,因为需要清理的内容可能不仅仅是 __pycache__
。
.pyc
文件都在里面。 - Martin Thoma如果您需要一个永久的解决方案来使Python缓存文件不出现在项目目录中:
从Python 3.8开始,您可以使用环境变量PYTHONPYCACHEPREFIX
来定义Python的缓存目录。
根据Python文档:
如果设置了此参数,则Python会将
.pyc
文件写入此路径下的镜像目录树中,而不是源树中的__pycache__
目录中。这相当于指定了-X pycache_prefix=PATH
选项。
示例
如果您在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://dev59.com/3l4b5IYBdhLWcg3wiSLV#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
PYTHONPYCACHEPREFIX=/var/cache/python
。 - Keelung/var/cache
:这可能会与系统上其他用户的缓存冲突 - 特别是在配置此项时在“分发级别”上(即将该设置作为所有用户的默认设置)。 - ssc我使用的命令:
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
}
希望它有所帮助!!!
我正在Mac上运行Python3和pip3。对我来说,解决方案如下(在我的项目根目录中):
pip3 install pyclean
pyclean .
我想强调的是,由于我看到有很多回答都涉及bash脚本编写,所以在软件开发中,最好采用经过测试的解决方案来解决问题(这正是一个成熟的Python包所代表的),而不是自己编写的解决方案。
这是我的别名,可以在Python 2和Python 3上使用,递归地删除所有的.pyc .pyo
文件以及__pycache__
目录。
alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
有一个不错的pip软件包。
pip install pyclean
pyclean --verbose .
完成
在项目目录中输入以下命令:
删除所有.pyc文件:
find . -path "*/*.pyc" -delete
删除所有.pyo文件:
find . -path "*/*.pyo" -delete
最后,要删除所有'__pycache__'目录,请输入以下命令:
find . -path "*/__pycache__" -type d -exec rm -r {} ';'
如果您遇到permission denied错误,请在以上所有命令前添加sudo。
*__pycache__
、*.pyc*
,且不区分文件和目录。大部分生成的rm
命令也是多余的。 - ivan_pozdeevfind
、grep
或rm
命令的正确方式,这可能会对任何包含useful.pycle.json
或important_deployment_setting_about__pycache__.txt
等文件的当前工作目录造成危险。我不能排除SO整个用户群体中有这样的情况。更不用说如果文件名中有空格,那么(rm -rf
命令)将会非常危险,可能会导致xargs
命令出现故障。因此我进行了编辑... - dlamblingrep: parentheses not balanced
- Daniel W.