Wie verwalte ich ein temporäres Verzeichnis, so dass es beim Schließen des Programms garantiert gelöscht wird?

7

Ich arbeite mit einem temporären Verzeichnis und möchte sicherstellen, dass es beim Schließen des Programms gelöscht wird (unabhängig davon, ob das Programm erfolgreich war). Ich verwende tempfile.mkdtemp , um das Verzeichnis zu erstellen und die erstellte Zeichenfolge in eine Unterklasse von str zu setzen, die das Verzeichnis mit dem Befehl __del__ löscht:

%Vor%

Hier ist, was ich nicht sicher bin: wenn das Programm schließt oder ein KeyboardInterrupt passiert, wird Python automatisch löschen / Garbage sammeln alle Variablen? Wenn nicht, wie kann ich sicherstellen, dass das Verzeichnis gelöscht wird?

Verwandte Informationen über Erstellen von Destruktor-Methoden in Python . Scheint so lange, wie das TempDir-Objekt nichts anderes referenziert. Wenn __del__ verwendet wird, um es zu zerstören, sollte es in Ordnung sein.

    
Jeff Tratner 10.06.2012, 00:03
quelle

3 Antworten

17

Ich würde keine __del__ -Methode verwenden, die Semantik ist unzuverlässig und könnte die Speicherbereinigung stören. Verwenden Sie einen Kontextmanager: Definieren Sie eine __enter__ - und __exit__ -Methode und geben Sie Ihre Verwendung des Objekts in einer with -Anweisung an. Es ist klar, es ist explizit und es wird ohne Sorge funktionieren.

Oder eine andere Möglichkeit, einen Kontextmanager zu erstellen:

%Vor%     
Ned Batchelder 10.06.2012, 00:28
quelle
7

Ich brauchte etwas Ähnliches für eine Paket-Testsuite, die von der Existenz einer bestimmten (halb verspotteten) Dateistruktur abhing. Bei vielen Testmodulen weiß ich nicht immer, welche Tests in welcher Reihenfolge ausgeführt werden oder wie der Testlauf abläuft.

Die Verwendung von __del__ beim Beenden der Anwendung ist meiner Erfahrung nach unzuverlässig. Und die Verwendung von Context Manager würde bedeuten, die Testdateien neu zu schreiben, um sicherzustellen, dass alles gut verpackt ist. Stattdessen verwende ich atexit . In <package>.tests.__init__ habe ich gerade hinzugefügt:

%Vor%

Python ruft dann shutil.rmtree(test_area) beim Beenden auf. Schlüsselwortargumente für die Fehlerbehandlung können bei Bedarf ebenfalls hinzugefügt werden.

    
osimons 16.12.2012 23:42
quelle
1

Es löscht alles nur, wenn das Programm endet (wie es normalerweise wäre).

Zur Veranschaulichung, hier ist der Code, den ich verwendet habe:

%Vor%

Und Ausgabe:

%Vor%

Wenn Sie es im interaktiven Modus ausführen, wird es nicht gelöscht, bis Sie das Programm beenden.

%Vor%

Wenn Sie schließlich eine raw_input('') -Zeile zur Datei hinzufügen, verhält sie sich genauso wie das Programmende, wenn Sie Strg-C drücken.

    
Jeff Tratner 10.06.2012 00:27
quelle

Tags und Links