43

我试图让 python 删除一些目录,但我得到了访问错误。我认为它的python用户帐户没有权限?

WindowsError: [Error 5] Access is denied: 'path'

是我运行脚本时得到的。
我试过了

shutil.rmtree  
os.remove  
os.rmdir

他们都返回相同的错误。

4

7 回答 7

78

我们在删除 Windows 上的文件和目录时遇到了问题,即使我们刚刚复制了它们,如果它们被设置为“只读”。shutil.rmtree()为您提供某种异常处理程序来处理这种情况。您调用它并提供如下异常处理程序:

import errno, os, stat, shutil

def handleRemoveReadonly(func, path, exc):
  excvalue = exc[1]
  if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
      os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
      func(path)
  else:
      raise

shutil.rmtree(filename, ignore_errors=False, onerror=handleRemoveReadonly)

您可能想尝试一下。

于 2009-07-31T21:15:18.917 回答
2

我从未使用过 Python,但我认为它会以任何用户执行脚本的方式运行。

于 2009-07-31T17:03:52.170 回答
2

脚本没有特殊用户,它们只是在执行脚本的当前登录用户下运行。

您是否尝试过检查:

  • 您正在尝试删除有效路径?然后
  • 路径没有锁定文件?
于 2009-07-31T17:20:31.840 回答
0

你是如何运行脚本的?从交互式控制台会话?如果是这样,只需打开一个 DOS 命令窗口(使用 cmd)并输入“whoami”。那就是您以交互方式运行脚本的人。

好的,我刚才看到了您的编辑...为什么不打印路径并检查属性以查看运行脚本的用户帐户是否具有所需的权限?

如果 whoami 在您的 Windows 版本上不起作用,您可以从命令窗口使用环境变量,如 SET USERNAME 和 SET DOMAINNAME。

于 2009-07-31T17:06:12.027 回答
0

@ThomasH:另一块砖墙。

在 unix 系统上,您必须确保父目录也是可写的。这是另一个版本:

def remove_readonly(func, path, exc):
    excvalue = exc[1]
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:

        # ensure parent directory is writeable too
        pardir = os.path.abspath(os.path.join(path, os.path.pardir))
        if not os.access(pardir, os.W_OK):
            os.chmod(pardir, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO)

        os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
        func(path)
    else:
        raise
于 2012-03-16T09:59:24.147 回答
-1

如果脚本作为计划任务运行(这似乎是清理脚本),它可能会作为 SYSTEM 运行。(不明智,但是)可以对目录设置权限,以使 SYSTEM 无权访问。

于 2009-07-31T17:09:15.623 回答
-2

搜索几个小时后的简单解决方案是首先检查该文件夹是否真的存在!

GIT_DIR="C:/Users/...."
if os.path.exists(GIT_DIR):
    shutil.rmtree(GIT_DIR)

这对我有用。

于 2018-01-26T21:39:10.223 回答