मैं सोच रहा था कि pyQGIS में फ़ाइल लॉक की रिहाई क्या ट्रिगर करती है?
मैं कॉल करके कुछ डेटा स्रोतों (अस्थायी रूप से उपयोग किए गए) को हटाने की कोशिश कर रहा हूं QgsVectorFileWriter.deleteShapeFile
, लेकिन मुझे ऐसा करने से पहले QGIS छोड़ना होगा। मैंने QgsVectorLayer ऑब्जेक्ट्स में स्रोत लोड किए हैं। स्रोत को हटाने से पहले इन सभी वस्तुओं और उनके संदर्भों को एकत्रित किया जाना चाहिए? क्या इसे लागू करने का कोई तरीका है?
मैं एक न्यूनतम कोड नमूना बनाने में कामयाब रहा हूं जो विफल रहता है। सुनिश्चित करें कि चलने से पहले अस्थायी डीआईआर खाली है।
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."
मैंने पाया कि यह काम करता है अगर मैं प्रसंस्करण एल्गोरिदम के बजाय QgsVectorFileWriter
बनाने के लिए उपयोग करता हूं layer2
। यदि qgis:clip
एल्गोरिथ्म का प्रयास करें तो मुझे वही त्रुटि मिलती है। तो क्या यह प्रसंस्करण में एक बग है? क्या मैं इसका गलत इस्तेमाल कर रहा हूं?