我试图让Python删除一些目录,我得到访问错误。 我认为它的python用户帐户没有权利?
WindowsError: [Error 5] Access is denied: 'path'
是我运行脚本时得到的。
我试过了
shutil.rmtree os.remove os.rmdir
他们都返回相同的错误。
我们在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)
你可能想尝试一下。
我从来没有使用Python,但我会假设它运行任何用户执行脚本。
这些脚本没有特殊的用户,他们只是在当前登录的执行脚本的用户下运行。
你有没有试过检查:
如果脚本作为计划任务运行(似乎可能是清理脚本),那么它可能会以SYSTEM身份运行。 这是(不明智的,但是)可以设置目录的权限,以便系统无法访问。
这些目录是空的,如果不是这些方法支持递归删除目录的内容?
你如何运行脚本? 从交互式控制台会话? 如果是这样,只要打开一个DOS命令窗口(使用cmd)并输入“whoami”。 这就是你以交互方式运行脚本的人。
好吧,我刚刚看到您的编辑…为什么不打印路径,并检查属性,看运行脚本的用户帐户是否具有所需的权限?
如果whoami不能在您的Windows版本上运行,您可以在命令窗口中使用SET USERNAME和SET DOMAINNAME等环境变量。
@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