Блокування файлів 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

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()

Я відредагував це, оскільки посилання на рядок слід видаляти після кожної ітерації курсору, інакше виклик поза циклом буде зайвим. Це я також проголосував за єдиний спосіб, коли я міг обійти ту саму проблему, коли мав її.
Волохатий

@ Волохатий ОК, але я думаю, що це приглушений момент. Python зменшує посилання на попередній об’єкт рядка на кожній ітерації, коли новій рядковій об'єкт присвоюється змінної рядка . row = Noneпісля циклу просто очищає призначення останнього рядка. Переміщення його всередині циклу - це дублювання зусиль. У будь-якому випадку, збирач сміття повинен розміщувати пам'ять, якщо arcpy або ArcMap внутрішньо не підтримують посилання на рядкові об'єкти.
тарен

нормально погодитись не погодитися, або це суперечка. Я знаю, що збирання сміття в архпі є помилковим, і насправді набагато швидше, якщо вимкнути його. Що стосується того, що рядок не встановлюється в рядок нічого, я знаю, що він працює так краще. Деякі кажуть, що встановити щось нікому не є зайвим, але це не так. Попросіть вимкнути збирання сміття на початку сценарію та виміряйте різниці в часі. Я також використовую дель рядки, які не гребти = немає, але це вже зовсім інша ОБГОВОРЕННЯ: спроба імпорту дс gc.disable ()
Волохаті

@Hairy, Мені не спало на думку відключити gc. Я спробую.
тарен

Це не працює для мене, тому що мені потрібен клас функцій. Також пізніше я отримую UpdateCursor для іншого класу функцій, і це також блокується. Я в кінцевому підсумку використовував дзеркала і хитрість руки, щоб дістатися там, де мені потрібно бути. Не впевнений, як довго він буде триматися. Дякую.
Джастін

1

Чи потрібно запускати свій скрипт ArcPy зсередини ArcMap? Якщо це не частина вбудованого інтерфейсу або набору інструментів, ви можете запустити його за межами ArcMap з консолі Python, IDLE або Eclipse тощо (доки у вас є відповідна ліцензія на машині, на якій вона працює). У такому випадку ви можете написати трохи Python-коду, щоб нерест вашого ArcPy-сценарію був підпроцесом, і блокування повинно бути звільнено, коли підпроцес закриється.

Замки ArcGIS - це біль. У мене були ситуації, коли замок зберігається навіть після вимкнення машини, що є монументальним болем (як правило, якщо Арка зазнала аварії, перш ніж вона може виправити замки). В крайньому випадку, якщо це трапиться, використовуйте Windows Explorer, щоб знайти .LOCK файл і видалити його вручну. Це не спрацює, якщо до нього звертаються ArcMap або процес Python, тому він відносно безпечний ... але це дійсно карта виїзду з в'язниці і не дуже хороша практика :)


1

Якщо ви належним чином видалили і об’єкти рядка, і курсор (наприклад del row, rows), і замок залишається, ймовірно, сам ArcMap, а не arcpy, все ще посилається на нього.

Чи посилається на файл форми шаром у змісті, або він додається до TOC вашим інструментом сценарію?

Якщо останнє, ви можете спробувати відключити "Додавання результатів операцій геообробки на дисплей" у розділі Геопроцедура-> Параметри геопроцедури в ArcMap.

Додаткова пропозиція. Якщо ви робите це як тимчасовий / проміжний набір даних, а кількість функцій не надто велика, спробуйте використовувати in_memoryробочу область замість файлу форм, щоб повністю вирішити проблему блокування та отримати хороше потенційне підвищення продуктивності. .

Просто не забудьте видалити робочу область in_memory або певні набори даних, які ви створюєте там, використовуючи Delete (Управління даними) перед тим, як вийти із сценарію, інакше він буде продовжувати перебувати в пам'яті, поки програма не закриється.

Нарешті, я також зазначу, що поведінка блокування формфайлу змінилася в 10.0, щоб стати більш суворою, не видаляючи файли блокування, коли ви видаляєте шар із змісту. Дивіться також цю статтю та пов’язане з цим питання .


Це, безумовно, ArcMap. Я думаю, що виклик курсору вбиває попереднє блокування курсорів. Я дзвоню SearchCursor на fc .. тоді UpdateCursor на іншому fc, і попередній замок відходить. Я можу викликати третій фіктивний курсор у файлі, який не потрібно буде видаляти лише для обробки стилю чорної скриньки блокування. Дякую.
Джастін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.