[Qgis-developer] release file after processing.runalg

Stefan Kiefer st_kiefer at web.de
Fri Apr 28 02:00:37 PDT 2017


Hi Enrico,
how is that file map_to_clip.tif created? There still could be a reference on that file, maybe because of the generation process (I assume that because you call it tempOutput, so there could be still a reference from another process). For example, if that file is visualized somewhere there definitly is a referene on that file.

cheers

Stefan

> enrico chiaradia <enrico.chiaradia at yahoo.it> hat am 27. April 2017 um 16:29 geschrieben:
> 
> 
> Hi Stefan and many thanks for your answer! but it seems not working :(
> Here the new code. I replaced "tempOutput" with "output". Layer is 
> correctly loaded and removed but "tempOutput" cannot be deleted.
> 
> import processing
> import os
> 
> tempOutput = 'D:/test_alg/map_to_clip.tif'
> maskFN = 'D:/test_alg/mask.shp'
> output = 'D:/test_alg/clipped_map.tif'
> 
> algRes = processing.runalg("gdalogr:cliprasterbymasklayer",
>                                          tempOutput,
>                                          maskFN,
> "-9999",False,False,False,5,4,75,6,1,False,0,False,"",
>                                          output)
> 
> try:
>      # add to the map
>      tempLay = QgsRasterLayer(output, "tempLay")
>      if not tempLay.isValid(): raise Exception("Failed to load tempLay")
>      QgsMapLayerRegistry.instance().addMapLayer(tempLay) #!!!!
> 
>      layermap = QgsMapLayerRegistry.instance().mapLayers()
>      for i, layer in layermap.iteritems():
>        if layer.source() == output:
>          print 'layername',layer.source()
>          # Remove layer references
>          QgsMapLayerRegistry.instance().removeMapLayer(layer.id()) #!!!!
> 
>      # Delete the file
>      os.remove(tempOutput)
> 
> except Exception as e:
>      print e
> 
> 
> 
> 
> Il 27/04/2017 16:07, Stefan Kiefer ha scritto:
> > Hi enrico,
> > as far as I see from the reference you added the solution would be to add the result (resp. output) to a Layer instead "tempOutput". Then you remove that Layer, I suppose while removing the layer a reference on "tempOutput" ist released.
> >
> > cheers
> >
> > Stefan
> >
> >> enrico chiaradia <enrico.chiaradia at yahoo.it> hat am 27. April 2017 um 15:13 geschrieben:
> >>
> >>
> >> Dear List,
> >>
> >> I'd like to remove an existing file (see [tempOutput]) after it was used
> >> by a geoalgorithm. The geoalgorithm works perfectly but after its
> >> execution, the file [tempOutput] is locked.
> >>
> >> Here a simple test script that returns "[Error 32] The process cannot
> >> access the file because it is being used by another process:
> >> 'D:/test_alg/map_to_clip.tif'":
> >>
> >> import processing
> >> import os
> >>
> >> tempOutput = 'D:/test_alg/map_to_clip.tif'
> >> maskFN = 'D:/test_alg/mask.shp'
> >> output = 'D:/test_alg/clipped_map.tif'
> >>
> >> algRes = processing.runalg("gdalogr:cliprasterbymasklayer",
> >>                                           tempOutput,
> >>                                           maskFN,
> >> "-9999",False,False,False,5,4,75,6,1,False,0,False,"",
> >>                                           output)
> >>
> >> try:
> >>       os.remove(tempOutput)
> >> except Exception as e:
> >>       print e
> >>
> >> I also found a solution on the web [1] but it doesn't work for me :( If
> >> I understand correctly, the trick is to load the file as layer and then
> >> release it. Here its implementation:
> >>
> >> import processing
> >> import os
> >>
> >> tempOutput = 'D:/test_alg/map_to_clip.tif'
> >> maskFN = 'D:/test_alg/mask.shp'
> >> output = 'D:/test_alg/clipped_map.tif'
> >>
> >> algRes = processing.runalg("gdalogr:cliprasterbymasklayer",
> >>                                           tempOutput,
> >>                                           maskFN,
> >> "-9999",False,False,False,5,4,75,6,1,False,0,False,"",
> >>                                           output)
> >>
> >> try:
> >>       # add to the map
> >>       tempLay = QgsRasterLayer(tempOutput, "tempLay")
> >>       if not tempLay.isValid(): raise Exception("Failed to load tempLay")
> >>       QgsMapLayerRegistry.instance().addMapLayer(tempLay) #!!!!
> >>
> >>       layermap = QgsMapLayerRegistry.instance().mapLayers()
> >>       for i, layer in layermap.iteritems():
> >>         print 'layername',layer.source()
> >>         if layer.source() == tempOutput:
> >>           # Remove layer references
> >>           QgsMapLayerRegistry.instance().removeMapLayer(layer.id()) #!!!!
> >>           # Delete the file
> >>           os.remove(tempOutput)
> >>
> >> except Exception as e:
> >>       print e
> >>
> >> I didn't find any other solution for the moment. Any suggestion is
> >> really very appreciate!
> >>
> >> Thanks
> >>
> >> enrico
> >>
> >>
> >> [1]
> >> https://gis.stackexchange.com/questions/93143/can-not-delete-file-after-using-runalg-function
> >>
> >>
> >>
> >> _______________________________________________
> >> Qgis-developer mailing list
> >> Qgis-developer at lists.osgeo.org
> >> List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
> >> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
> 
>


More information about the Qgis-developer mailing list