ปล่อยไฟล์ล็อค PyQGIS หรือไม่


16

ฉันสงสัยว่าอะไรเป็นสาเหตุให้เกิดการปลดล็อคไฟล์ใน pyQGIS?

ฉันกำลังพยายามลบแหล่งข้อมูลไม่กี่แห่ง (ใช้ชั่วคราว) โดยการโทรQgsVectorFileWriter.deleteShapeFileแต่ฉันต้องออกจาก QGIS ก่อนจึงจะทำได้ ฉันโหลดแหล่งข้อมูลลงในวัตถุ QgsVectorLayer วัตถุและการอ้างอิงถึงวัตถุเหล่านี้ทั้งหมดจะต้องถูกเก็บรวบรวมขยะก่อนที่ฉันจะสามารถลบแหล่งที่มาได้หรือไม่ มีวิธีบังคับนี้หรือไม่


ฉันจัดการเพื่อสร้างตัวอย่างรหัสขั้นต่ำที่ล้มเหลว ตรวจสอบว่า temp dir ว่างเปล่าก่อนเรียกใช้

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อัลกอริทึม ดังนั้นนี่เป็นข้อบกพร่องในการประมวลผลหรือไม่? ฉันใช้ผิดหรือเปล่า?

คำตอบ:


9

ขออภัยที่ต้องตอบคำถามของฉันเอง แต่ฉันคิดว่าฉันพบวิธีแก้ปัญหา

ตามที่ปรากฎมันทำงานได้ดีถ้าคุณเพิ่มเลเยอร์ลงในแผนผังรีจีสตรีแล้วลบอีกครั้ง การลงทะเบียนแผนที่จะเป็นเจ้าของเลเยอร์ดังนั้นเมื่อมีการลบออกจากรีจิสทรีการล็อกจะถูกปล่อยให้เป็นอิสระ โปรดทราบว่าคุณต้องเพิ่มเลเยอร์ในคำอธิบายแผนภูมิ ( .addMapLayer(layer, addToLegend = False) จะไม่ทำงาน)

ยังไม่แน่ใจว่าจะเรียกวิธีแก้ปัญหานี้หรือวิธีแก้ปัญหา แต่มันทำงาน

# ...

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

หากใครมีข้อมูลเพิ่มเติมฉันยินดีที่จะเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้


ฉันต้องลบสองเลเยอร์ดังกล่าว ... ฉันสามารถลบหนึ่งเลเยอร์โดยใช้วิธีการด้านบน .. ไฟล์อื่น ๆ ทั้งหมดยกเว้น. dbf และ. shp ของวินาทีจะถูกลบ .. มีวิธีแก้ไขใด ๆ ที่จะลบทั้งสองไฟล์ เช่นกัน?
rao
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.