Блокировка файла ArcGIS Python SearchCursor?

11

У меня есть скрипт, который получает значение из поля шейп-файла для возврата пользователю.

Кажется, что только когда arcpy.SearchCursor вызывается, ArcMap 10.0 блокирует файл и не удаляется после завершения работы скрипта. Чтобы снять блокировку, я должен закрыть ArcMap. В скрипте я удаляю объект SearchCursor после его использования, а также объект строки.

Сценарий работает так, что он пытается удалить папку рабочей области при последующих запусках, но не может из-за блокировки ... пока, конечно, я не закрою ArcMap.

Есть ли какой-нибудь совет, как убрать этот замок?

Джастин
источник

Ответы:

4

проблема была решена после перехода из:

rows = arcpy.UpdateCursor(fc)   
delete = rows.deleteRow  
for row in rows:  
    delete(row)  
del row  
del rows

в

rows = arcpy.UpdateCursor(fc)
for row in rows:
    rows.deleteRow(row)
del row
del rows
b.bacia
источник
3

См. Невозможно снять блокировку с файловой базы геоданных и класса объектов, созданного в скрипте Python . Похоже на ту же проблему. Я обошел это раньше, явно удалив класс объектов. Я не уверен, будет ли это работать во всех случаях.

import arcpy

fcPath = 'c:/temp/features.shp'
idFld = 'OBJECTID'
cur = arcpy.SearchCursor(fcPath)
for row in cur:
    id = row.getValue(idFld)
    row = None
cur = None
r = arcpy.Delete_management(fcPath)

print r.getOutput(0)

Форсирование сборки мусора также может работать, но я догадываюсь, что это как-то связано с внутренней работой arcpy или ArcMap.

import gc
gc.collect()
Тарен
источник
Я отредактировал это, так как ссылка на строку должна удаляться после каждой итерации курсора, в противном случае вызов вне цикла является излишним. Я также проголосовал за это как единственный способ обойти ту же проблему, когда она у меня была.
Волосатые
@Hairy Хорошо, но я думаю, что это немой момент. Python уменьшает ссылки на предыдущий объект строки на каждой итерации, когда новый объект строки назначается переменной строки . row = Noneпосле того, как цикл просто очищает назначение последней строки. Перемещение его внутри цикла - это дублирование усилий. В любом случае сборщик мусора должен освободить память, если только Arcpy или ArcMap не поддерживают внутреннюю ссылку на объекты строки.
Тарен
Это нормально, чтобы согласиться не согласиться, или это спорный вопрос. Я знаю, что сборка мусора в arcpy некорректна и на самом деле намного быстрее, если вы ее отключите. Что касается того, что в строке ничего не установлено, я знаю, что так будет лучше. Кто-то скажет, что ничего не устанавливать - это излишне, но это не так. Попробуйте отключить сборку мусора в начале сценария и измерьте разницу во времени. Я также использую del row, а не row = none, но это еще одно предположение: попробуйте import gc gc.disable ()
Hairy
@Hairy, мне не пришло в голову отключить gc. Я попробую.
Тарен
Это не работает для меня, потому что мне нужен класс пространственных объектов. Также позже я получаю UpdateCursor для другого класса пространственных объектов, и это также блокируется. Я закончил тем, что использовал зеркала и ловкость рук, чтобы добраться туда, где мне нужно быть. Не уверен, как долго это продержится. Спасибо.
Джастин
1

Вам нужно запустить скрипт ArcPy из ArcMap? Если он не является частью интерфейса или набора инструментов, который вы создали, вы можете запускать его вне ArcMap из консоли Python, IDLE или Eclipse и т. Д. (При условии, что у вас есть соответствующая лицензия на компьютере, на котором он работает). Если это так, вы можете написать небольшой код Python для порождения вашего скрипта ArcPy в качестве подпроцесса, и блокировка должна быть снята при закрытии подпроцесса.

Замки ArcGIS - это боль. У меня были ситуации, когда блокировка сохраняется даже после выключения машины, что является монументальной болью (обычно, если Arc разбился до того, как смог привести в порядок замки). В крайнем случае, если это произойдет, используйте проводник Windows, чтобы найти файл .LOCK и удалить его вручную. Это не будет работать, если к нему обращается ArcMap или процесс Python, так что это относительно безопасно ... но это действительно карта Get-Out-of-Jail и не очень хорошая практика :)

MappaGnosis
источник
1

Если вы правильно удаляете как объекты строки, так и объекты курсора (например del row, rows), и блокировка остается, скорее всего, потому что сам ArcMap, а не arcpy, все еще ссылается на него.

На шейп-файл ссылается слой в оглавлении или он добавлен в оглавление вашим скриптовым инструментом?

Если последнее, вы можете попробовать отключить «Добавить результаты операций геообработки на экран» в разделе « Геообработка-> Параметры геообработки в ArcMap».

Дополнительное предложение: если вы делаете это как временный / промежуточный набор данных, и число объектов не слишком велико, попробуйте использовать in_memoryрабочее пространство вместо шейп-файла, чтобы полностью обойти проблему блокировки и получить хороший потенциальный прирост производительности. ,

Обязательно удалите рабочую область in_memory или определенные наборы данных, которые вы создаете там, используя Delete (Data Management) перед выходом из сценария, в противном случае она будет оставаться в памяти до тех пор, пока приложение не закроется.

Наконец, я также хотел бы отметить, что поведение блокировки шейп-файла изменилось в 10.0, чтобы стать более строгим, не удаляя файлы блокировки при удалении слоя из оглавления. Смотрите также эту статью и этот связанный вопрос .

blah238
источник
Это определенно ArcMap. Я думаю, что вызов курсора убивает блокировку предыдущих курсоров. Я вызываю SearchCursor на fc..then UpdateCursor на другом fc, и предыдущая блокировка исчезает. Я могу вызвать трижды фиктивный курсор на файл, который не нужно удалять, просто чтобы обработать стиль блокировки черного ящика. Спасибо.
Джастин