pyQGIS에서 파일 잠금 해제를 트리거하는 것이 무엇인지 궁금합니다.
을 호출하여 일부 데이터 소스 (일시적으로 사용)를 삭제하려고하는데 QgsVectorFileWriter.deleteShapeFile
QGIS를 종료해야합니다. 소스를 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
알고리즘을 시도해도 동일한 오류가 발생합니다 . 이것이 처리상의 버그입니까? 내가 잘못 사용하고 있습니까?