Pourquoi fermer un ensemble de données dans GDAL Python?


17

Je vois assez souvent dans le code Python GDAL que les gens ferment des ensembles de données à la fin de leur script. Pourquoi est-il judicieux de fermer un ensemble de données dans Python GDAL? Y a-t-il des conséquences si je ne le fais pas?

import gdal

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

# close dataset
ds = None

Parfois, le destructeur C ++ fait autre chose que le nettoyage (pour certains pilotes), comme le recalcul des statistiques. C'est une bonne pratique de régler sur None, tout ce que blah238 dit est également correct AFAIK.

Réponses:


15

Je ne pense pas que cela ait un but à la fin du script, car le garbage collector Python fera automatiquement la même chose à la fin du script. La raison pour laquelle vous voudrez peut-être le faire est au milieu de votre script, pour récupérer les ressources détenues en accédant à l'ensemble de données, supprimer les verrous de fichiers, etc. afin de pouvoir les réutiliser.

del ds devrait avoir le même effet mais est plus clair quant à son intention.

L'approche la plus pythonique serait d'utiliser une withinstruction , mais GDAL / OGR ne l'implémente pas. Cependant, il existe certains wrappers GDAL / OGR comme Rasterio et Fiona qui le font.


2
Considérez les objets de fichier Python. Vous en ouvrez un avec f = open(filename)et vous fermez un avec f.close(). Pas del fou f = None. Pourquoi? Parce que ce qui arrive aux objets après qu'ils ne sont plus référencés est un détail de l'implémentation de l'interpréteur et parce qu'explicite vaut mieux qu'implicite ( python.org/dev/peps/pep-0020 ).
sgillies

1
D'accord, mais les liaisons GDAL Python ne sont pas exactement Pythonic. Il y a une GDALClose()méthode qui devrait être appelée si vous voulez être explicite (je vois que Rasterio appelle cela en interne ).
blah238

2
En Python, GDALClose()n'a pas été implémenté, mais définir l'ensemble de données sur None(c'est- à -dire ds = None) est équivalent.
Arthur
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.