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