<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#006600">
<div class="moz-cite-prefix">Hi Stefan, thanks again!<br>
the file "map_to_clip.tif" is saved on the HD and it is not
submitted to any process before executing the script (I know that
because I can delete it before running the script).<br>
At the same time, I noticed that the file
"map_to_clip.tif.aux.xml" was created after running the script and
closing qgis (absolutely, I did no other things!).<br>
Can that suggest the process that locks the file?<br>
<br>
<br>
Il 28/04/2017 11:00, Stefan Kiefer ha scritto:<br>
</div>
<blockquote
cite="mid:543925102.110243.1493370037299@webmail.strato.com"
type="cite">
<pre wrap="">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
</pre>
<blockquote type="cite">
<pre wrap="">enrico chiaradia <a class="moz-txt-link-rfc2396E" href="mailto:enrico.chiaradia@yahoo.it"><enrico.chiaradia@yahoo.it></a> 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:
</pre>
<blockquote type="cite">
<pre wrap="">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
</pre>
<blockquote type="cite">
<pre wrap="">enrico chiaradia <a class="moz-txt-link-rfc2396E" href="mailto:enrico.chiaradia@yahoo.it"><enrico.chiaradia@yahoo.it></a> 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]
<a class="moz-txt-link-freetext" href="https://gis.stackexchange.com/questions/93143/can-not-delete-file-after-using-runalg-function">https://gis.stackexchange.com/questions/93143/can-not-delete-file-after-using-runalg-function</a>
_______________________________________________
Qgis-developer mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Qgis-developer@lists.osgeo.org">Qgis-developer@lists.osgeo.org</a>
List info: <a class="moz-txt-link-freetext" href="https://lists.osgeo.org/mailman/listinfo/qgis-developer">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a>
Unsubscribe: <a class="moz-txt-link-freetext" href="https://lists.osgeo.org/mailman/listinfo/qgis-developer">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a>
</pre>
</blockquote>
</blockquote>
<pre wrap="">
</pre>
</blockquote>
<pre wrap="">
</pre>
</blockquote>
<p><br>
</p>
</body>
</html>