I was wondering what triggers the release of file locks in pyQGIS?
I am trying to delete a few data sources (used temporarily) by calling
QgsVectorFileWriter.deleteShapeFile, but I have to quit QGIS before I can do that. I have loaded the sources into QgsVectorLayer objects. Must all of these objects and references to them be garbage collected before I can delete the source? Is there a way to force this?
I've managed to create a minimal code sample that fails. Make sure temp dir is empty before running.
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') 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."
I found that it works if I use
QgsVectorFileWriter to create
layer2, instead of the processing algorithm. I get the same error if try the
qgis:clip algorithm. So is this a bug in processing? Am I using it wrong?