2009-08-19 11 views
1

Grundsätzlich möchte ich eine unendliche Größe (genauer gesagt, Festplatte statt Speicher gebunden) dict in einem Python-Programm, das ich schreibe. Es scheint, dass die Module tempfile und shelve dafür natürlich geeignet sind, aber ich kann nicht sehen, wie man sie sicher zusammen verwendet. Ich möchte die TTF-Datei gelöscht werden, wenn das Regal ist GCED (oder Garantie Löschen, nachdem das Regal ist außer Betrieb, unabhängig davon, wann), aber die einzige Lösung, die ich für diese finden kann, beinhaltet tempfile.TemporaryFile() zu öffnen ein Datei-Handle, der den Dateinamen vom Handle abruft, diesen Dateinamen zum Öffnen eines Shelves verwendet, den Verweis auf das Datei-Handle behält, um zu verhindern, dass GCed wird (und die Datei gelöscht wird), und dann einen Wrapper in das Shelve legt Referenz. Hat jemand eine bessere Lösung als dieses komplizierte Chaos?Gibt es eine einfache Möglichkeit, eine Python-Temporärdatei in einem Regal zu verwenden (und sicherzustellen, dass sie sich selbst säubert)?

Einschränkungen: Kann nur die Standard-Python-Bibliothek verwenden und muss vollständig plattformübergreifend sein.

Antwort

1

Ich würde lieber von shelve.Shelf erben und überschreiben die Close-Methode (*), um die Verknüpfung der Dateien zu lösen. Beachten Sie, dass Sie abhängig vom verwendeten spezifischen dbm-Modul möglicherweise mehr als eine Datei haben, die das Shelf enthält. Eine Lösung könnte darin bestehen, ein temporäres Verzeichnis anstatt einer temporären Datei zu erstellen und alles im Verzeichnis zu entfernen, wenn das erledigt ist. Die andere Lösung wäre, an ein bestimmtes dbm-Modul (z. B. bsddb oder dumbdbm) zu binden und speziell die von diesen Bibliotheken erstellten Dateien zu entfernen.

(*) Beachten Sie, dass die Close-Methode eines Shelfs auch aufgerufen wird, wenn das Regal Müll gesammelt wird. Der einzige Fall, wie Sie mit Müll-Dateien enden könnten, ist, wenn der Interpreter abstürzt oder getötet wird.