Зачем закрывать набор данных в GDAL Python?

17

Я часто вижу в коде Python GDAL, что люди закрывают наборы данных в конце своего скрипта. Почему имеет смысл закрывать набор данных в Python GDAL? Есть ли последствия, если я не сделаю это?

import gdal

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

# close dataset
ds = None
ustroetz
источник
Иногда деструктор C ++ выполняет другие операции, кроме очистки (для некоторых драйверов), такие как пересчет статистики. Хорошей практикой является установка None, все, что говорит blah238, также верно AFAIK.

Ответы:

15

Я не думаю, что это имеет какое-либо назначение в конце скрипта, так как сборщик мусора Python будет делать то же самое автоматически при выходе из скрипта. Возможно, вы захотите сделать это в середине вашего скрипта, чтобы восстановить ресурсы, удерживаемые путем доступа к набору данных, снять блокировки файлов и т. Д., Чтобы вы могли использовать их повторно.

del ds должен иметь тот же эффект, но более ясен в отношении его намерений.

Более Pythonic подход будет использовать withоператор , но GDAL / OGR не реализует его. Тем не менее, есть некоторые оболочки GDAL / OGR, такие как Rasterio и Fiona .

blah238
источник
2
Рассмотрим объекты файла Python. Вы открываете один с помощью f = open(filename)и закрываете один с помощью f.close(). Не del fили f = None. Почему? Потому что то, что происходит с объектами после того, как на них больше нет ссылок, является подробностью реализации интерпретатора, и потому что явное лучше, чем неявное ( python.org/dev/peps/pep-0020 ).
sgillies
1
Согласен, но привязки GDAL Python не совсем Pythonic. Существует GDALClose()метод, который следует вызывать, если вы хотите быть явным (я вижу, что Растерио вызывает это внутренне ).
blah238
2
В Python GDALClose()не реализовано, но установка набора данных в None(то есть ds = None) эквивалентна.
Артур