Creo que hay dos métodos que podrían evitar el problema:
-
Utilizar la capa de memoria como entrada
Cree una copia de su capa de entrada como memoria de esta manera puede seguir utilizando los mismos datos que la entrada original, pero también "libera" el shapefile de estar bloqueado. La capa de memoria también tiene que ser añadida al QgsMapLayerRegistry
antes de poder utilizarlo en el algoritmo de procesamiento.
import glob, os, processing
input = "//input.shp"
output = "//output_100.shp"
layer = QgsVectorLayer(input,"any_name","ogr")
feats = [ feat for feat in layer.getFeatures() ]
temp = QgsVectorLayer("LineString?crs=epsg:4326", "result", "memory")
# 'temp' is the new memory layer
# Change 'LineString' to 'Point' or 'Polygon' etc depending on your layer type
temp_data = temp.dataProvider()
attr = layer.dataProvider().fields().toList()
temp_data.addAttributes(attr)
temp.updateFields()
temp_data.addFeatures(feats)
QgsMapLayerRegistry.instance().addMapLayer(temp)
# Adds memory layer with all copied attributes to ToC
interval = 100
processing.runalg("qgis:densifygeometriesgivenaninterval", temp, interval, output)
# Processing algorithm uses memory layer as input parameter
QgsMapLayerRegistry.instance().removeMapLayer(temp.id())
del layer
# Removes from ToC, deletes the dependency on original input shapefile
os.chdir("C:\Users\gfb11209\Desktop\New folder (2)//")
for input_file in glob.glob("input*"):
os.remove(input_file)
# Sets current directory to desired folder and removes "input" files
for output_file in os.listdir("."):
os.rename(output_file, output_file.replace("output_100", "input"))
# Renames "output_100" files to "input"
(Crédito a @Detlev y @xunilk por sus muy útiles respuestas de este Correo electrónico: .)
-
Dividir script / reiniciar QGIS
Podrías dividir tu script en dos partes. Ejecute la primera parte para ejecutar el algoritmo y, una vez guardada la salida, reinicie QGIS y ejecute la segunda parte del script. De esta manera, los archivos de entrada ya no deberían ser utilizados y pueden ser eliminados con seguridad.
Así que tu primer script podría ser así:
import processing
input = "//input.shp"
output = "//output_100.shp"
interval = 100
processing.runalg("qgis:densifygeometriesgivenaninterval", input, interval, output)
Reinicie QGIS y luego ejecútelo:
import os, glob
os.chdir("C:/" + os.getenv('USERNAME') + "/SHP_Path//")
for input_file in glob.glob("input*"):
os.remove(input_file) # Removes all files beginning with "input" (eg. input.dbf, input.prj etc)
for output_file in os.listdir("."):
os.rename(output_file, output_file.replace("output_100", "input"))