PyQGIS'de dosya kilitlerinin serbest bırakılmasını neyin tetiklediğini merak ediyordum.
Arayarak birkaç veri kaynağını (geçici olarak kullanılır) silmeye çalışıyorum QgsVectorFileWriter.deleteShapeFile
, ancak bunu yapmadan önce QGIS'den çıkmam gerekiyor. Kaynakları QgsVectorLayer nesnelerine yükledim. Kaynağı silmeden önce tüm bu nesneler ve bunlara yapılan başvurular çöp toplanmalı mıdır? Bunu zorlamanın bir yolu var mı?
Başarısız olan minimal bir kod örneği oluşturmayı başardım. Çalıştırmadan önce geçici yönün boş olduğundan emin olun.
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."
İşleme algoritması yerine QgsVectorFileWriter
oluşturmak için kullanırsam çalıştığını gördüm layer2
. qgis:clip
Algoritmayı denerseniz aynı hatayı alıyorum . Peki bu işlemede bir hata mı? Yanlış mı kullanıyorum?