在Python中删除目录

在Python中删除目录,python,directory,delete-file,Python,Directory,Delete File,shutil.rmtree不会删除Windows上的只读文件。是否存在与“rm-rf”相当的python?为什么?为什么这么痛苦?网站上有一条评论说: rmtree有它的缺点。虽然在许多情况下确实可以使用shutil.rmtree(),但在某些情况下它不起作用。例如,shutil.rmtree()无法删除Windows下标记为只读的文件 通过从PyWin32导入win32api和win32con模块,并在rmgeneric()函数中添加类似“win32api.SetFileAttributes(

shutil.rmtree
不会删除Windows上的只读文件。是否存在与“rm-rf”相当的python?为什么?为什么这么痛苦?

网站上有一条评论说:

rmtree有它的缺点。虽然在许多情况下确实可以使用shutil.rmtree(),但在某些情况下它不起作用。例如,shutil.rmtree()无法删除Windows下标记为只读的文件

通过从PyWin32导入win32api和win32con模块,并在rmgeneric()函数中添加类似“win32api.SetFileAttributes(path,win32con.FILE_ATTRIBUTE_NORMAL)”的行,可以克服这个障碍。我使用这种方法修复了Subversion 1.4的hot-backup.py脚本,因此它可以在Windows下工作。感谢您提供的方法


我不使用Windows,因此无法验证此操作是否有效。

如果从PyWin32导入win32api,则可以使用:

win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

使文件不再为只读。

shutil.rmtree
可以使用错误处理函数,在删除文件时遇到问题时将调用该函数。您可以使用该函数强制删除有问题的文件

灵感来自和:


(我还没有测试过这个片段,但它应该足以让你开始了)

这里是Steve发布的一个变体,它使用了相同的基本机制,并且这个已经过测试:-)


另一种方法是将Windows上的rmtree定义为

rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])

这可能会通过发布Python 3.5(目前-2015年6月-仍在开发中)来解决,这在文档中给出了一个提示

你可以找到错误报告。并且是相应的变更集

请参见中新添加的示例:


“为什么?为什么这么痛苦?”也许没有人花五分钟在……上提交bug,你可能是第一个!我知道我来晚了,但我只是觉得这对我来说很有用,即使是在Python单元测试中。谢谢一行代码:
shutil.rmtree('mypath',onerror=lambda func,path,u:(os.chmod(path,stat.S_IWRITE),func(path))
rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])
import os, stat
import shutil

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onerror=remove_readonly)