2014-01-21 3 views
14

Ich möchte shutil.rmtree in Python verwenden, um ein Verzeichnis zu entfernen. Das fragliche Verzeichnis enthält ein Steuerverzeichnis .git, das als schreibgeschützt markiert und ausgeblendet wird.shutil.rmtree zum Entfernen von Readonly-Dateien

Das schreibgeschützte Flag bewirkt, dass rmtree fehlschlägt. In Powershell würde ich "del-force" ausführen, um das Entfernen des schreibgeschützten Flags zu erzwingen. Gibt es in Python ein Äquivalent? Ich würde wirklich lieber nicht den ganzen Baum zweimal gehen, aber das onerror Argument rmtree scheint nicht um die Operation zu wiederholen, so kann ich nicht

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

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

Haben Sie versucht, die Datei im 'onerror 'zu entfernen 'callback? –

+0

Es ist seltsam, dass .git schreibgeschützt ist – wim

+0

Ich müsste einen vollständigen (rekursiven) rmtree im onerror machen, da es das .git-Unterverzeichnis ist, das readonly ist, aber das könnte funktionieren. Und 'git is make Versteckt und readonly vermutlich, um das Unix-Verhalten zu simulieren, dotfiles nicht anzuzeigen. Ich denke, das Verhalten ist schrecklich (hg tut das nicht), aber ich muss damit leben :-( –

Antwort

20

Nach mehr Untersuchung verwenden, wird die folgende Arbeit:

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

Mit anderen Worten, tatsächlich entfernen Sie die Datei in der Onerror-Funktion. (Sie müssen möglicherweise nach einem Verzeichnis im onerror-Handler suchen und in diesem Fall rmdir verwenden - ich brauchte das nicht, aber es könnte nur etwas Spezifisches sein.