Коли я намагаюся видалити клас об’єктів, після або під час використання програми двигуна Arcgis, яка використовує той самий клас функцій, у мене з’явилася помилка щодо блокування, тому я не можу позбутися цього блокування, поки не перезавантажую комп'ютер.
Я хотів би знати спосіб видалення замків за допомогою arcpy або arcobjects 10.1, було б ідеально, якщо я можу покататися на замці всередині програми arcengine, яка також блокує базу даних геоданих, я бачив різні повідомлення в SE про замки, але ніхто не з них дає рішення про безкоштовні блокування за допомогою ArcObjects.
У мене було подібне питання деякий час назад ( gis.stackexchange.com/q/28977/8104 ). Я не зміг знайти відповідь про блокування, хоча там була гарна інформація про видалення об'єктів пам'яті.
Якщо ви використовуєте сценарій Arcpy, проблеми з блокуванням даних стали ще більш проблемними з 10.1.
Якщо замки створюються за вашим кодом, ви не прибираєте за собою. Відпустіть усі посилання на класи функцій, робочі простори, курсори тощо. Блокування видаляється, коли у вас більше немає посилань на об'єкти, які блокуються.
Ну, це так, як це має працювати, але це рідко трапляється. Зазвичай код спрацьовує періодично, але часто виходить з ладу в різних місцях.
Проблема, як видається, полягає в тому, що замки просто сидять там "на деякий час", але код працює набагато швидше, ніж швидкість, з якою знімаються замки. Однак деякі вбудовані інструменти Arc, здається, змушують очищати блокування на вимогу (оскільки блокування застосовується до цілих GDB одночасно, блокування заважає працювати з будь-яким із класів функцій). Ці інструменти: arcpy.Compact_management () та arcpy.Exists ().
Ось невеличка функція, яку я використовую у своєму коді, що значно підвищила надійність (для сценарію, який створює та редагує декілька класів GDB та Feature Class):
def clearWSLocks(inputWS):'''Attempts to clear locks on a workspace, returns stupid message.'''if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):return'Workspace (%s) clear to continue...'% inputWS
else:return'!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!'% inputWS
Він використовується шляхом простого проходження шляху до робочої області (GDB) до функції, і він повинен бути виконаний після кожної операції або на робочій області (тобто створення GDB), або у класах особливостей всередині робочої області (тобто Курсори, додавання полів, обчислення тощо). . Наприклад (показано тут як окремий сценарій, з функцією вгорі; щоб використовувати функцію, скопіюйте її та вставіть між імпортом та фактичною програмою, як показано тут):
import arcpy
def clearWSLocks(inputWS):'''Attempts to clear locks on a workspace, returns stupid message.'''if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):return'Workspace (%s) clear to continue...'% inputWS
else:return'!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!'% inputWS
GDBpath='C:/Temp/'GDBname='Test.gdb'
tableName ='SweetFC'
arcpy.CreateFileGDB_management(GDBpath,GDBname)print(clearWSLocks(GDBpath+GDBname))
arcpy.CreateTable_management(GDBpath+GDBname, tableName)print(clearWSLocks(GDBpath+GDBname))# etc....
Пропоноване рішення по @StacyR буде працювати у всіх ситуаціях , крім виняткових редагування замків (ED) в відповідно до ARCGIS довідкової документації.
Якщо замки створюються за вашим кодом, ви не прибираєте за собою. Відпустіть усі посилання на класи функцій, робочі простори, курсори тощо. Блокування видаляється, коли у вас більше немає посилань на об'єкти, які блокуються.
Я знаю, що цей потік досить старий, але у мене виникає проблема з можливістю видалити FGDB в межах arcpy. Що саме ви маєте на увазі під "Відпустіть усі посилання на класи функцій, робочі простори, курсори тощо". Як би я пішов про випуск зазначених посилань?