在Windows上shutdownil.rmtree失败,并显示“访问被拒绝" [英] shutil.rmtree fails on Windows with 'Access is denied'

查看:82
本文介绍了在Windows上shutdownil.rmtree失败,并显示“访问被拒绝"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在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)

推荐答案

查看此问题:

python脚本在Windows中以什么用户身份运行?

显然,答案是将文件/文件夹更改为只读,然后将其删除.

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失败,并显示“访问被拒绝"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆