问题描述
在Python中,在包含只读文件的文件夹上运行shutil.rmtree
时,将显示以下异常:
In Python, when running shutil.rmtree
over a folder that contains a read-only file, the following exception is printed:
File "C:\Python26\lib\shutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:\Python26\lib\shutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:\Python26\lib\shutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:\Python26\lib\shutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:\Python26\lib\shutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:\Python26\lib\shutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:\Python26\lib\shutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:\Python26\lib\shutil.py", line 221, in rmtree
onerror(os.remove, fullname, sys.exc_info())
File "C:\Python26\lib\shutil.py", line 219, in rmtree
os.remove(fullname)
WindowsError: [Error 5] Access is denied: 'build\\tcl\\tcl8.5\\msgs\\af.msg'
在文件属性"对话框中查找,我注意到af.msg
文件被设置为只读.
Looking in File Properties dialog I noticed that af.msg
file is set to be read-only.
所以问题是:解决这个问题的最简单的解决方案/解决方案是什么-鉴于我的意图是在Windows上做等效的rm -rf build/
? (无需使用诸如unxutils或cygwin之类的第三方工具-因为此代码的目标是在安装了Python 2.6和PyWin32的裸机上运行)
So the question is: what is the simplest workaround/fix to get around this problem - given that my intention is to do an equivalent of rm -rf build/
but on Windows? (without having to use third-party tools like unxutils or cygwin - as this code is targeted to be run on a bare Windows install with Python 2.6 w/ PyWin32 installed)
推荐答案
查看此问题:
显然,答案是将文件/文件夹更改为只读,然后将其删除.
Apparently the answer is to change the file/folder to not be read-only and then remove it.
这是@Sridhar Ratnakumar提到的 pathutils.py
中的onerror()
处理程序在评论中:
Here's onerror()
handler from pathutils.py
mentioned by @Sridhar Ratnakumar in comments:
def onerror(func, path, exc_info):
"""
Error handler for ``shutil.rmtree``.
If the error is due to an access error (read only file)
it attempts to add write permission and then retries.
If the error is for another reason it re-raises the error.
Usage : ``shutil.rmtree(path, onerror=onerror)``
"""
import stat
if not os.access(path, os.W_OK):
# Is the error an access error ?
os.chmod(path, stat.S_IWUSR)
func(path)
else:
raise
这篇关于在Windows上shutdownil.rmtree失败,并显示“访问被拒绝"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!