Когда я пытаюсь удалить класс пространственных объектов, после или во время использования приложения движка 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 и классов объектов внутри них):
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...'% inputWSelse:return'!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!'% inputWS
Он используется путем простой передачи пути к рабочему пространству (GDB) в функцию, и его следует выполнять после каждой операции с рабочим пространством (т. Е. Созданием GDB) или классами объектов в рабочем пространстве (т. Е. Курсорами, добавлением полей, вычислениями и т. Д.). , Например (показан здесь как автономный скрипт с функцией вверху; чтобы использовать функцию, скопируйте ее и вставьте между импортом и реальной программой, как показано здесь):
import arcpydef 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...'% inputWSelse:return'!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!'% inputWSGDBpath='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....
Компакт не работает, если есть замок. Это действительно увеличит производительность, когда вы выполняете много операций FGDB, но за счет собственного времени выполнения.
Предлагаемое решение по @StacyR будет работать во всех ситуациях , кроме исключительных редактирования замков (ED) в соответствии с ARCGIS справочной документации.
Если блокировки создаются вашим кодом, то вы не убираете за собой. Отпустите все ссылки на классы пространственных объектов, рабочие области, курсоры и т. Д. Блокировки удаляются, когда у вас больше нет ссылок на блокируемые объекты.
Я знаю, что эта ветка довольно старая, но у меня возникла проблема с возможностью удаления FGDB внутри arcpy. Что именно вы подразумеваете под "Отпустите все ссылки на классы пространственных объектов, рабочие области, курсоры и т. Д." Как бы я выпустил упомянутые ссылки?