피쳐 클래스에서 잠금 제거


11

동일한 기능 클래스를 사용하는 Arcgis 엔진 앱을 사용한 후 또는 사용하는 동안 기능 클래스를 삭제하려고하면 잠금과 관련된 오류가 발생하여 컴퓨터를 다시 시작할 때까지이 잠금을 탈 수 없습니다.

arcpy 또는 arcobjects 10.1을 사용하여 잠금을 제거하는 방법을 알고 싶습니다. 지오 데이터베이스를 잠그는 arcengine 앱 내부에서 잠금을 탈 수 있다면 완벽합니다 .SE에 잠금에 대해 다른 게시물을 보았지만 아무도 없습니다. 그중 ArcObject를 사용하여 잠금을 해제하는 솔루션을 제공합니다.


1
나는 비슷한 질문을했다 ( gis.stackexchange.com/q/28977/8104 ). 메모리 객체에서 삭제에 대한 좋은 정보가 있었지만 잠금에 대한 답변을 찾을 수 없습니다.
Aaron

답변:


12

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...' % 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....

3
잠금 장치가 있으면 컴팩트 가 작동하지 않습니다. FGDB의 많은 작업을 실행할 때 자체 런타임 비용으로 실제로 성능이 향상됩니다.
Michalis Avraam

왜 Exists가 두 번 있는지 궁금해하는 경우 clearWSLocks에서 all () if의 세 번째 진술을 의미합니까?
makak

나는 동의 할 수 있으며, 자물쇠를 지우는 것을 찾지 못했습니다. :( 그리고 지금까지 많은 다른 것들을 시도했습니다.
Vidar


7

코드에 의해 잠금이 생성 된 경우에는 자신을 정리하지 않은 것입니다. 피쳐 클래스, 작업 공간, 커서 등에 대한 모든 참조를 해제하십시오. 잠그는 객체에 대한 참조가 더 이상 없으면 잠금이 제거됩니다.


1
이 스레드는 꽤 오래되었지만 arcpy 내에서 FGDB를 삭제할 수없는 문제가 있습니다. "특징 클래스, 작업 공간, 커서 등에 대한 모든 참조를 공개하십시오."라는 의미는 무엇입니까? 상기 언급을 발표하는 방법은 무엇입니까?
GeoJohn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.