清除所有__pycache__文件夹和.pyc/。python3项目中的Pyo文件。我见过许多用户建议将pyclean脚本与Debian捆绑在一起,但这并没有删除文件夹。在将文件推送到分布式交换机之前,我想要一个简单的方法来清理项目。
当前回答
请到你的终端然后输入:
$rm __pycache__
它将被移除。
其他回答
为什么不直接使用rm -rf __pycache__?然后运行git add -A从你的存储库中删除它们,并将__pycache__/添加到你的.gitignore文件中。
这是我的别名,适用于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将在镜像目录树的此路径下写入.pyc文件,而不是在源树的__pycache__目录中。这相当于指定-X pycache_prefix=PATH选项。
例子
如果将下面的行添加到~/。Linux下的profile shell配置文件:
export PYTHONPYCACHEPREFIX="${HOME}/.cache/Python"
Python不会在你的项目目录中创建恼人的__pycache__目录;相反,它会把它们都放在~/.cache/Python下
如果您使用Linux和macOS,可以将这些行添加到~/。Bash_profile / ~/。跨平台shell配置的概要文件(也会根据需要创建文件夹):
# set python cache folder for .pyc files:
# https://stackoverflow.com/a/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
我在Mac上运行Python3和pip3。对我来说,解决方案如下 (在我项目的根目录下):
pip3 install pyclean
pyclean .
我想强调的是,因为我看到许多答案都涉及bash脚本,所以软件中的最佳实践是倾向于使用经过测试的问题解决方案(这正是已建立的python包所代表的),而不是手卷方法。
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进程)。
推荐文章
- 如何在一行中连接两个集而不使用“|”
- 从字符串中移除前缀
- 代码结束时发出警报
- 如何在Python中按字母顺序排序字符串中的字母
- 在matplotlib中将y轴标签添加到次要y轴
- 如何消除数独方块的凹凸缺陷?
- 为什么出现这个UnboundLocalError(闭包)?
- 使用Python请求的异步请求
- 如何检查一个对象是否是python中的生成器对象?
- 如何从Python包内读取(静态)文件?
- 如何计算一个逻辑sigmoid函数在Python?
- python: SyntaxError: EOL扫描字符串文字
- Pipenv:命令未找到
- 如何删除目录内的文件和文件夹?
- 根据Pandas中的另一列提取列值