ArcGIS Python SearchCursor 파일 잠금?


11

shapefile의 필드에서 값을 가져와 사용자에게 반환하는 스크립트가 있습니다.

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

커서를 반복 할 때마다 행 참조를 제거해야하므로이를 편집했습니다. 그렇지 않으면 루프 외부의 호출이 불필요합니다. 이것은 또한 내가 받았을 때 같은 문제를 해결할 수있는 유일한 방법으로 투표 한 것입니다.
털이 많은

@Hairy는 괜찮지 만 음소거 지점이라고 생각합니다. 파이썬 은 새로운 행 객체 가 row 변수에 할당 될 때 각 반복 에서 이전 행 객체 에 대한 참조를 감소시킵니다 . 루프 후 마지막 행 할당을 정리합니다. 루프 내로 이동하는 것은 노력의 중복입니다. 어쨌든, 가비지 수집기는 arcpy 또는 ArcMap이 내부적으로 행 객체에 대한 참조를 유지하지 않는 한 메모리 할당을 해제해야합니다. row = None
tharen

동의하지 않는 것에 동의하는 것이 좋습니다. 나는 arcpy의 가비지 수집에 결함이 있음을 알고 있으며, 끄면 실제로 훨씬 빠릅니다. 행이 행에 아무것도 설정되어 있지 않은 경우 행이 더 잘 작동한다는 것을 알고 있습니다. 어떤 사람들은 아무것도 아닌 것으로 설정하는 것이 불필요한 것이라고 말하지만 그렇지 않습니다. 스크립트 시작시 가비지 콜렉션을 끄고 시차를 측정하십시오. 나는 또한 행 = 없음이 아니라 델 행을 사용하지만 그것은 또 다른 토론입니다 : import gc gc.disable ()
Hairy

@Hairy, gc를 비활성화하지 않았습니다. 시도해 볼게요.
tharen

기능 클래스가 필요하기 때문에 이것은 작동하지 않습니다. 또한 나중에 다른 피쳐 클래스에서 UpdateCursor를 얻었으며이 또한 잠 깁니다. 나는 필요한 곳에 도착하기 위해 거울과 얇은 손을 사용했다. 얼마나 오래 지속 될지 잘 모르겠습니다. 감사.
Justin

1

ArcMap 내부에서 ArcPy 스크립트를 실행해야합니까? 빌드 한 인터페이스 또는 도구 상자의 일부가 아닌 한 Python 콘솔, IDLE 또는 Eclipse 등에서 ArcMap 외부에서 실행할 수 있습니다 (실행중인 컴퓨터에 적절한 라이센스가있는 한). 이 경우 ArcPy 스크립트를 하위 프로세스로 생성하는 작은 Python 코드를 작성할 수 있으며 하위 프로세스가 닫히면 잠금이 해제됩니다.

ArcGIS 잠금은 고통입니다. 기계를 종료 한 후에도 잠금 장치가 지속되는 상황이 있었는데 이는 엄청난 고통입니다 (보통 잠금 장치를 정리하기 전에 아크가 충돌 한 경우). 최후의 수단으로 이런 일이 발생하면 Windows 탐색기를 사용하여 .LOCK 파일을 찾아 수동으로 삭제하십시오. ArcMap 또는 Python 프로세스에서 액세스하는 경우 작동하지 않으므로 상대적으로 안전합니다 ...하지만 실제로 JET (Get-Out-of-of-Jail) 카드이며 좋은 습관은 아닙니다. :)


1

행 및 커서 객체 (예 del row, rows:)를 모두 올바르게 삭제 하고 잠금이 유지되는 경우 arcpy가 아닌 ArcMap 자체가 여전히 참조하기 때문일 수 있습니다.

쉐이프 파일이 목차의 레이어에 의해 참조됩니까, 아니면 스크립트 도구에 의해 TOC에 추가됩니까?

후자의 경우, 해제 시도 할 수 있습니다 "디스플레이에 작업을 지오 프로세싱의 결과 추가" 에서 Geoprocessing-> 지오 프로세싱 옵션 ArcMap의의를.

추가 제안 : 임시 / 중간 데이터 세트 로이 작업을 수행하고 기능 수가 너무 많지 않은 in_memory경우 모양 파일 대신 작업 공간을 사용하여 잠금 문제를 완전히 해결하고 잠재적 인 성능 향상을 얻으십시오. .

스크립트를 종료하기 전에 in_memory 작업 공간 또는 Delete (데이터 관리) 를 사용하여 생성 한 특정 데이터 세트를 삭제 해야합니다. 그렇지 않으면 애플리케이션이 닫힐 때까지 계속 메모리에 상주합니다.

마지막으로, shapefile 잠금 동작이 목차에서 레이어를 제거 할 때 잠금 파일을 제거하지 않음으로써보다 엄격 해 지도록 10.0에서 변경되었습니다. 이 기사관련 질문 도 참조하십시오 .


확실히 ArcMap입니다. 커서를 호출하면 이전 커서 잠금이 종료된다고 생각합니다. fc에서 SearchCursor를 호출 한 다음 다른 fc에서 UpdateCursor를 호출하면 이전 잠금이 사라집니다. 자물쇠 살해 블랙 박스 스타일을 처리하기 위해 삭제할 필요가없는 파일에 대해 더미 더미 커서를 호출 할 수 있습니다. 감사.
Justin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.