Python shutil.rmtree删除只读文件

Python shutil.rmtree删除只读文件,python,shutil,Python,Shutil,我想在Python中使用shutil.rmtree删除目录。该目录包含一个.git控制目录,git将其标记为只读和隐藏 只读标志导致rmtree失败。在Powershell中,我会执行“del-force”来强制删除只读标志。Python中是否有一个等价物?我真的不想遍历整个树两次,但是rmtree的onerror参数似乎没有重试该操作,所以我不能使用 def set_rw(operation, name, exc): os.chmod(name, stat.S_IWRITE) shu

我想在Python中使用
shutil.rmtree
删除目录。该目录包含一个
.git
控制目录,git将其标记为只读和隐藏

只读标志导致
rmtree
失败。在Powershell中,我会执行“del-force”来强制删除只读标志。Python中是否有一个等价物?我真的不想遍历整个树两次,但是rmtree的
onerror
参数似乎没有重试该操作,所以我不能使用

def set_rw(operation, name, exc):
    os.chmod(name, stat.S_IWRITE)

shutil.rmtree('path', onerror=set_rw)

经过进一步调查,以下各项似乎有效:

def del_rw(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)
shutil.rmtree(path, onerror=del_rw)

换句话说,在onerror函数中实际删除文件。(您可能需要在OneError处理程序中检查目录,并在这种情况下使用rmdir-我不需要它,但它可能只是关于我的问题的特定内容。

shutil.rmtree用于删除非空目录(删除树)

要仅删除文件,可以使用以下代码:


    import os
    import stat
    def rmv_rof(file_name):
        '''Remov Read Only Files'''
        if os.path.exists(file_name):
            os.chmod(file_name, stat.S_IWRITE)
            os.remove(file_name)
        else:
            print('The file does not exist.')
    rmv_rof('file_name_here')
您可以在此处阅读详细信息:


您是否尝试过删除
onerror
回调中的文件?奇怪的是.git是只读的,我必须执行完整(递归)操作onerror中的rmtree,因为它的.git子目录是只读的,但这可能会起作用。而“git被隐藏并只读大概是为了模拟Unix不显示点文件的行为。我认为这种行为很可怕(hg不这样做),但我不得不接受它:-(你可以先更改文件的权限,然后进行浏览和编辑。如果你愿意,我可以发布一个解决方案。你不必像遍历一样遍历它两次。更改权限,然后删除文件。此外,我不确定你的系统在哪个系统上,但如果它的窗口继承了权限,那么你应该能够悬挂顶层,如果设置正确,则将其级联

    import os
    import stat
    def rmv_rof(file_name):
        '''Remov Read Only Files'''
        if os.path.exists(file_name):
            os.chmod(file_name, stat.S_IWRITE)
            os.remove(file_name)
        else:
            print('The file does not exist.')
    rmv_rof('file_name_here')