Warum sollte ein Datensatz in GDAL Python geschlossen werden?

17

Ich sehe ziemlich oft in Python GDAL-Code, dass Leute Datensätze am Ende ihres Skripts schließen. Warum ist es sinnvoll, einen Datensatz in Python GDAL zu schließen? Gibt es irgendwelche Konsequenzen, wenn ich es nicht tue?

import gdal

# open dataset
ds = gdal.Open('test.tif')

# close dataset
ds = None
ustroetz
quelle
Manchmal erledigt der C ++ - Destruktor andere Aufgaben als das Aufräumen (für einige Treiber), z. B. das Neuberechnen von Statistiken. Es ist eine gute Praxis, auf None zu setzen. Alles, was blah238 sagt, ist auch korrekt. AFAIK.

Antworten:

15

Ich glaube nicht, dass dies am Ende des Skripts einen Sinn hat , da der Python-Garbage-Collector dasselbe automatisch macht, wenn das Skript beendet wird. Möglicherweise möchten Sie dies in der Mitte Ihres Skripts tun, um die Ressourcen wiederherzustellen, die durch den Zugriff auf das Dataset gehalten werden, Dateisperren zu entfernen usw., damit Sie sie wiederverwenden können.

del ds sollte den gleichen Effekt haben, ist aber klarer in Bezug auf seine Absicht.

Der pythonischere Ansatz wäre, eine withAnweisung zu verwenden , aber GDAL / OGR implementiert sie nicht. Es gibt jedoch einige GDAL / OGR-Wrapper wie Rasterio und Fiona , die dies tun.

blah238
quelle
2
Betrachten Sie Python-Dateiobjekte. Sie öffnen eine mit f = open(filename)und Sie schließen eine mit f.close(). Nicht del foder f = None. Warum? Weil das, was mit Objekten geschieht, nachdem sie nicht mehr referenziert wurden, ein Detail der Implementierung des Interpreters ist und weil explizit besser ist als implizit ( python.org/dev/peps/pep-0020 ).
sgillies
1
Einverstanden, aber die GDAL-Python-Bindungen sind nicht genau Pythonic. Es gibt eine GDALClose()Methode, die aufgerufen werden sollte, wenn Sie explizit sein möchten (ich sehe, dass Rasterio dies intern aufruft ).
blah238
2
Wurde in Python GDALClose()nicht implementiert, aber das Festlegen des Datasets auf None(dh ds = None) ist äquivalent.
Arthur