2012-06-27 7 views
5

Ich muss ein Skript entwickeln, das einige Berechnungen starten wird. Ich möchte, dass dieses Skript^C korrekt behandelt, indem es ein temporäres Verzeichnis löscht. Ich habe in der signal_handler mehrere Versionen von Code versucht:Python, Verzeichnis entfernen: Fehler Datei existiert

shutil.rmtree(self.temp) 

oder sogar

os.system("rm -rf " + self.temp) 

, wenn ich die Ausführung Störe und der Handler aufgerufen wird, das Verzeichnis zu entfernen, erhalte ich Fehler wie:

OSError: [Errno 17] File exists : 'foo' 

oder

rm: Unable to remove directory foo: File exists 

Nach der Ausführung ist das Verzeichnis, das ich löschen möchte, leer, und ich kann es mit einem rm -r in der Shell löschen. Allerdings, wenn ich den Code ausführen:

for f in os.listdir(self.temp): 
    os.remove(os.path.join(self.temp,f)) 

for f in os.listdir(self.temp): 
    print f 

os.rmdir(self.temp) 

Ich bin natürlich, Fehler bekommen, aber die zweite Schleife findet diese Datei: .nfsA13D3

Wer eine Lösung für mein Problem? Vielen Dank!

+6

'.nfs *' Dateien werden erstellt, wenn Sie eine Datei auf einem NFS-Mounten 'rm' verwenden, das noch von etwas verwendet wird. Sobald der Referenzzähler für die '.nfs'-Datei auf 0 fällt, sollte er * verschwinden * (Ich habe Fälle in der Vergangenheit kennengelernt, in denen dies nicht immer der Fall ist, aber eine manuelle Bereinigung erforderlich ist). – twalberg

Antwort

0

Vielen Dank für den Kommentar, ich habe Dateien in meinem Python-Code geöffnet und mein signal_handler hat nicht überprüft, ob meine Dateiobjekte geschlossen waren oder nicht. Aus diesem Grund konnte ich das Verzeichnis, das diese Dateien enthält, nicht im Skript löschen.

7

Dies ist ein bekanntes Problem mit NFS eingehängten Dateisystemen und einige Ihrer Dienstprogramme schließen keine Dateien. Ein Betriebssystem kann die Datei am Leben erhalten, auch wenn Sie es entfernen, aber dies ist nicht möglich, wenn nfs beteiligt ist. Die Lösung für das Betriebssystem besteht darin, diese temporäre .nfs-Datei zu erstellen und sie beizubehalten, bis der Dateideskriptor verwendet wird.

Es gibt keine echte Lösung für dieses Problem. Die .nfs-Datei wird verschwinden, wenn der letzte Deskriptor geschlossen wird, aber das (leere) Verzeichnis ist immer noch vorhanden. Die einzige mögliche Lösung besteht darin, den noch offenen Dateideskriptor zu finden und ihn zu schließen, aber es hängt davon ab, ob er sich in Ihrem Programm befindet. In meinem Fall war es in einer externen, kompilierten Bibliothek und ich hatte keine Chance zu finden, wo es durchsickerte.