Por que fechar um conjunto de dados no GDAL Python?

17

Vejo muitas vezes no código Python GDAL que as pessoas fecham os conjuntos de dados no final de seu script. Por que faz sentido fechar um conjunto de dados no Python GDAL? Existem consequências se eu não fizer isso?

import gdal

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

# close dataset
ds = None
ustroetz
fonte
Às vezes, o destruidor de C ++ faz outras coisas que não a limpeza (para alguns drivers), como recálculo de estatísticas. É uma boa prática definir como Nenhum, tudo que blah238 diz que está correto também como AFAIK.

Respostas:

15

Eu não acho que isso tenha algum objetivo no final do script, pois o coletor de lixo Python fará a mesma coisa automaticamente quando o script sair. O motivo pelo qual você pode fazer isso é no meio do seu script, para recuperar os recursos mantidos acessando o conjunto de dados, remover bloqueios de arquivos etc. para que você possa reutilizá-los.

del ds deve ter o mesmo efeito, mas é mais claro quanto à sua intenção.

A abordagem mais pitônica seria usar uma withdeclaração , mas o GDAL / OGR não a implementa. No entanto, existem alguns wrappers GDAL / OGR como Rasterio e Fiona .

blah238
fonte
2
Considere objetos de arquivo Python. Você abre um com f = open(filename)e fecha um com f.close(). Não del fou f = None. Por quê? Porque o que acontece aos objetos depois que eles não são mais referenciados é um detalhe da implementação do intérprete e porque explícito é melhor que implícito ( python.org/dev/peps/pep-0020 ).
precisa
1
Concordou, mas as ligações GDAL Python não são exatamente Pythonic. Existe um GDALClose()método que deve ser chamado se você quiser ser explícito (vejo que o Rasterio chama isso internamente ).
blah238
2
No Python, GDALClose()não foi implementado, mas definir o conjunto de dados para None(ou seja, ds = None) é equivalente.
Arthur