19 votos

PyQGIS archivo de liberación de bloqueo

Me preguntaba qué es lo que desencadena la liberación de bloqueos de archivo en pyQGIS?

Estoy tratando de eliminar un par de fuentes de datos (temporal) llamando QgsVectorFileWriter.deleteShapeFile, pero tengo que salir de QGIS antes de que yo pueda hacerlo. He cargado las fuentes en QgsVectorLayer objetos. Todos debemos de estos objetos y las referencias a ellos ser recolectado antes de que pueda eliminar la fuente? Es allí una manera de forzar a esto?

ACTUALIZACIÓN: he conseguido crear un código mínimo de la muestra que se produce un error. Asegúrese de temp dir está vacía antes de correr.

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."

ACTUALIZACIÓN 2: he encontrado que funciona si uso QgsVectorFileWriter a crear layer2, en lugar del algoritmo de procesamiento. Me sale el mismo error si se intenta la qgis:clip algoritmo. Así que se trata de un error en el procesamiento? Estoy utilizando mal?

11voto

Leonardo Puntos 81

Lo siento para mantener responder a mis propias preguntas, pero creo que he encontrado una solución.

Como resulta que funciona bien si se agrega la capa al mapa del registro y, a continuación, retire de nuevo. El mapa registro toma posesión de la capa, por lo que cuando se elimina del registro, los bloqueos se liberan. Tenga en cuenta que usted tiene que agregar la capa de la leyenda (.addMapLayer(layer, addToLegend = False) no funcionará).

Todavía no sé si llamar a esto una solución o una solución, pero hace el trabajo.

# ...

# 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):    
    # ...

Si alguien tiene más info, yo estaría encantado de aprender más acerca de esto.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X