PyQGIS 파일 잠금을 해제 하시겠습니까?


16

pyQGIS에서 파일 잠금 해제를 트리거하는 것이 무엇인지 궁금합니다.

을 호출하여 일부 데이터 소스 (일시적으로 사용)를 삭제하려고하는데 QgsVectorFileWriter.deleteShapeFileQGIS를 종료해야합니다. 소스를 QgsVectorLayer 객체에로드했습니다. 소스를 삭제하기 전에 이러한 모든 객체와 객체에 대한 참조를 가비지 수집해야합니까? 이것을 강제하는 방법이 있습니까?


나는 실패한 최소한의 코드 샘플을 만들었습니다. 실행하기 전에 temp dir이 비어 있는지 확인하십시오.

from qgis.core import *
import processing, os, gc

project_temp_dir = "C:/Path/To/My/Dir/"      
layer1_path = project_temp_dir + "layer1.shp"
layer2_path = project_temp_dir + "layer2.shp"
input_layer = QgsMapLayerRegistry.instance().mapLayersByName('in_layer')[0]
if not input_layer.isValid(): raise Exception("Failed to grab input layer")

# Create layer 1
err = QgsVectorFileWriter.writeAsVectorFormat(input_layer, layer1_path, "utf-8", input_layer.crs())   
if err != QgsVectorFileWriter.NoError: raise Exception("Failed to write layer 1")

# Load layer 1
layer1 = QgsVectorLayer(layer1_path, "lyr1", "ogr")
if not layer1.isValid(): raise Exception("Failed to load layer 1")

# Use layer 1 to create layer 2, read-only makes no difference
# if not layer1.setReadOnly(): raise Exception("Could not set layer 1 to read-only")
processing.runalg("qgis:reprojectlayer", layer1, "EPSG:54030", layer2_path)

# Load layer 2
layer2 = QgsVectorLayer(layer2_path, "lyr2", "ogr")
if not layer2.isValid(): raise Exception("Failed to load layer 2")

del layer1
del layer2 
del input_layer
gc.collect()
print "Garbage: " + str(gc.garbage) # Empty

# Remove data sources for layers - FAILS!!
for f in os.listdir(project_temp_dir):          
    if f.endswith(".shp") and not os.path.isdir(project_temp_dir + f):              
        if not QgsVectorFileWriter.deleteShapeFile(project_temp_dir + f):
            # F*%&ing locks. 
            print "Failed to clear project temp directory."

처리 알고리즘 대신 QgsVectorFileWriter을 만드는 데 사용하면 작동한다는 것을 알았습니다 layer2. qgis:clip알고리즘을 시도해도 동일한 오류가 발생합니다 . 이것이 처리상의 버그입니까? 내가 잘못 사용하고 있습니까?

답변:


9

내 질문에 계속 대답해서 죄송하지만 해결책을 찾았습니다.

결과적으로 레이어를 맵 레지스트리에 추가 한 다음 다시 제거하면 제대로 작동합니다. 맵 레지스트리는 계층의 소유권을 가지므로 레지스트리에서 계층을 삭제하면 잠금이 해제됩니다. 범례에 레이어를 추가해야합니다 ( .addMapLayer(layer, addToLegend = False)가 작동하지 않습니다).

이 솔루션을 솔루션으로 호출할지 아니면 해결 방법으로 호출할지 확실하지 않지만 작업을 수행합니다.

# ...

# Replace the following code (note: should do error checking on map registry functions):

# Load layer 1
layer1 = QgsVectorLayer(layer1_path, "lyr1", "ogr")
if not layer1.isValid(): raise Exception("Failed to load layer 1")
QgsMapLayerRegistry.instance().addMapLayer(layer1) #!!!!

# Use layer 1 to create layer 2  
processing.runalg("qgis:reprojectlayer", layer1, "EPSG:54030", layer2_path)

# Load layer 2
layer2 = QgsVectorLayer(layer2_path, "lyr2", "ogr")
if not layer2.isValid(): raise Exception("Failed to load layer 2")
QgsMapLayerRegistry.instance().addMapLayer(layer2) #!!!!

# Remove layer references
QgsMapLayerRegistry.instance().removeMapLayer(layer1.id()) #!!!!
QgsMapLayerRegistry.instance().removeMapLayer(layer2.id()) #!!!!

# Remove data sources for layers
for f in os.listdir(project_temp_dir):          
    if f.endswith(".shp") and not os.path.isdir(project_temp_dir + f):    
    # ...

누구든지 더 많은 정보를 가지고 있다면 이것에 대해 더 많이 알게되어 기쁩니다.


두 개의 레이어를 삭제해야합니다 ... 위의 방법을 사용하여 하나를 삭제할 수 있습니다 .. 두 번째의 .dbf 및 .shp를 제외한 다른 모든 파일이 삭제됩니다. 게다가?
rao
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.