PyQGIS dosya kilitlerini serbest bırakmak?


16

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 QgsVectorFileWriteroluşturmak için kullanırsam çalıştığını gördüm layer2. qgis:clipAlgoritmayı denerseniz aynı hatayı alıyorum . Peki bu işlemede bir hata mı? Yanlış mı kullanıyorum?

Yanıtlar:


9

Kendi sorularıma cevap verdiğim için özür dilerim, ama bir çözüm bulduğumu düşünüyorum.

Sonuç olarak, katmanı harita kayıt defterine eklerseniz ve sonra tekrar kaldırırsanız iyi çalışır. Harita kayıt defteri katmanın sahipliğini alır, bu nedenle kayıt defterinden silindiğinde kilitler serbest bırakılır. Efsaneye katman eklemeniz gerektiğini unutmayın ( .addMapLayer(layer, addToLegend = False) çalışmaz).

Buna bir çözüm mü yoksa geçici bir çözüm mü demek istediğinizden emin değilim, ama bu işi yapıyor.

# ...

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

Daha fazla bilgi varsa, bu konuda daha fazla bilgi edinmek için mutlu olurum.


i bu tür iki katmanı silmek zorunda ... yukarıdaki yöntemi kullanarak birini silmek mümkün .. ikinci .dbf ve .shp dışında tüm diğer dosyalar siliniyor .. bu iki dosyayı silmek için herhangi bir çözüm var mı de?
rao
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.