Más

¿Arcpy.Delete_management () no elimina la carpeta?

¿Arcpy.Delete_management () no elimina la carpeta?


Escribí un script en Python que toma dos archivos ascii que representan superficies, luego los convierte en rásteres y finalmente niega sus valores (es decir, multiplica todas las celdas por -1). En la secuencia de comandos, creo una carpeta temporal para almacenar datos intermedios y me gustaría eliminarla después de que la secuencia de comandos se haya ejecutado, sin embargo, arcpy.Delete_management no funciona. Mi código es el siguiente:

import os, arcpy from arcpy.sa import * inputInterp = arcpy.GetParameterAsText (0) inputDiff = arcpy.GetParameterAsText (1) outputDir = arcpy.GetParameterAsText (2) #Ascii to Raster Conversion, almacenar la salida en la ubicación temporal arcpy.Outritev.overwrite = True arcpy.env.workspace = outputDir tempFolder = outputDir + os.path.sep + "pyOut" arcpy.CreateFolder_management (arcpy.env.workspace, "pyOut") outInterp = tempFolder + os.path.sep + "Interp_Rast" outDiff = tempFolder + os.path.sep + "Diff_Rast" dtype = "FLOAT" arcpy.ASCIIToRaster_conversion (inputInterp, outInterp, dtype) arcpy.ASCIIToRaster_conversion (inputDiff, outDiff, dtype) ) outDiffNegate = Negate (outDiff) #Cleanup arcpy.Delete_management (tempFolder)

Ahora, aquí está la parte que no entiendo. Si agrego:

arcpy.Delete_management (outIntNegate) arcpy.Delete_management (outDiffNegate)

Justo antes de:

arcpy.Delete_management (tempFolder)

Luego, tempFolder se elimina como se esperaba. Planeo expandir este script después de que esta parte funcione y realmente no quiero eliminar cada variable temporal individual que creo. Sospecho que esto tiene algo que ver con el espacio de trabajo, pero no pude encontrar ninguna solución después de navegar por publicaciones similares. ¿Algunas ideas?


Creo que esto es un problema con ArcGIS que tiene identificadores de archivos abiertos en los archivos de su carpeta temporal.

Como descubrimos en nuestros comentarios, puede eliminar las variables de Python y luego usar la herramienta Eliminar para eliminar el directorio temporal (pero no eldeldeclaración, que simplemente elimina la variable), pero aún tendría que eliminar explícitamente cada objeto de resultado ...

Para evitar la necesidad de eliminar todo explícitamente, puede ponerlo todo en un método y luego llamar a ese método. Cuando el método regresa, todo lo que está dentro de su alcance se elimina automáticamente.

Nota: este ejemplo no es realmente ideal ya que está pasando variables en el ámbito global en lugar de usar argumentos / valores de retorno, pero es muy simple.

import os, arcpy from arcpy.sa import * inputInterp = arcpy.GetParameterAsText (0) inputDiff = arcpy.GetParameterAsText (1) outputDir = arcpy.GetParameterAsText (2) #Ascii to Raster Conversion, almacenar la salida en la ubicación temporal arcpy.Outritev.overwrite = True arcpy.env.workspace = outputDir tempFolder = outputDir + os.path.sep + "pyOut" arcpy.CreateFolder_management (arcpy.env.workspace, "pyOut") # Defina un método para que los resultados estén en un alcance interno def raster_operations (): outInterp = tempFolder + os.path.sep + "Interp_Rast" outDiff = tempFolder + os.path.sep + "Diff_Rast" dtype = "FLOAT" arcpy.ASCIIToRaster_conversion (inputInterp, outInterp, dtypeCID) arcpy. , outDiff, dtype) # Invertir los rásteres a sus valores originales outIntNegate = Negate (outInterp) outDiffNegate = Negate (outDiff) # Llamar al método definido anteriormente raster_operations () #Cleanup arcpy.Delete_management (tempFolder)

Ver el vídeo: Python: Working with Feature Data using ArcPy