shutil.rmtree to remove readonly files
我想在Python中使用shutil.rmtree删除目录。有问题的目录包含.git控制目录,该目录git标记为只读和隐藏。
只读标志导致rmtree失败。在Powershell中,我可以执行" del -force "来强制删除只读标志。 Python中是否有等效功能?我真的不想遍历整棵树两次,但是rmtree的onerror参数似乎没有重试该操作,因此我不能使用
1 2 3 4
| def set_rw(operation, name, exc):
os.chmod(name, stat.S_IWRITE)
shutil.rmtree('path', onerror=set_rw) |
- 您是否尝试过在onerror回调中删除文件?
-
奇怪的是.git是只读的
-
我必须在onerror中执行一个完整的(递归)rmtree,因为它是.git子目录,它是只读的,但是可能行得通。并且'git被设置为隐藏和只读,以模拟Unix不显示点文件的行为。我认为这种行为是可怕的(汞没有这样做),但我必须忍受它:-(
-
您可以先更改文件的权限,然后再对其进行编辑,如果您愿意,我可以为此发布解决方案
-
@wnnmaw并不意味着使用os.walk来获取所有内容并强制执行RW模式时,需要两次走树吗?如果那是您的意思,那么我知道该怎么做(如我所说,如果可以的话,我只是想避免这样做)。但是,谢谢你的建议。
-
您不必走遍两次,就像走遍一样更改权限,然后删除文件。此外,我不确定您使用的是哪种系统,但是如果继承了Windows的权限,那么如果设置正确,您应该可以更改顶级并将其级联下来
经过更多调查后,以下内容似乎起作用:
1 2 3 4
| def del_rw(action, name, exc):
os.chmod(name, stat.S_IWRITE)
os.remove(name)
shutil.rmtree(path, onerror=del_rw) |
换句话说,实际上是在onerror函数中删除该文件。 (在这种情况下,您可能需要检查onerror处理程序中的目录并使用rmdir-我并不需要它,但这可能只是我的问题所特有的。