shutil.rmtree
不会删除Windows上的只读文件。有一个python相当于“rm -rf”?为什么哦为什么这么痛苦?
答案 0 :(得分:42)
shutil.rmtree
可以使用错误处理函数,该函数在删除文件时会被调用。您可以使用它来强制删除有问题的文件。
灵感来自http://mail.python.org/pipermail/tutor/2006-June/047551.html和http://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html:
import os
import stat
import shutil
def remove_readonly(func, path, excinfo):
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(top, onerror=remove_readonly)
(我没有测试过该片段,但它应该足以让你开始了)
答案 1 :(得分:3)
如果从PyWin32导入win32api,可以使用:
win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)
使文件不再是只读文件。
答案 2 :(得分:3)
另一种方法是在Windows上将rmtree定义为
rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])
答案 3 :(得分:2)
ActiveState网站上有评论说:
shutil.rmtree有它的缺点。虽然确实可以在很多情况下使用shutil.rmtree(),但在某些情况下它不起作用。例如,shutil.rmtree()无法删除在Windows下标记为只读的文件。
通过从PyWin32导入win32api和win32con模块并将类似“win32api.SetFileAttributes(path,win32con.FILE_ATTRIBUTE_NORMAL”)的行添加到rmgeneric()函数中,可以克服这个障碍。我使用这种方法来修复热备份Subversion 1.4的.py脚本,所以它可以在Windows下运行。谢谢你的配方。
我不使用Windows,因此无法验证这是否有效。
答案 4 :(得分:2)
这是史蒂夫发布的变体,它使用相同的基本机制,并且测试了 : - )
答案 5 :(得分:2)
这可能会随着 Python 3.5 (目前 - 2015年6月 - 仍在开发中)的发布而修复,意思是在文档中提示这一点。
请参阅Python 3.5 docs中新添加的示例:
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)