Entender el comportamiento de cancelación en las herramientas de secuencias de comandos

Cuando se ejecuta una herramienta, hay un botón de cancelación disponible para detener la herramienta y que deje de procesar. De manera predeterminada, cuando una herramienta de secuencia de comandos o una herramienta de la caja de herramientas Python se cancela, la secuencia de comandos se cancelará después de la línea actual del código y la herramienta fallará y mostrará el mensaje de error adecuado ('Secuencia de comandos cancelada <tool_name>... (<tool_name>) anulada por el usuario.'). Cuando sucede esto, la cancelación es definitiva, no se podrá ejecutar ningún código una vez que se realiza la cancelación. En algunas secuencias de comandos, esto es todo lo que se requiere, pero en otros casos, es posible que se necesiten otros pasos después de la cancelación para limpiar los datos, proporcionar mensajes de herramienta personalizada u otros comportamientos.

La clase arcpy.env incluye dos propiedades, autoCancelling y isCancelled para controlar los comportamientos de cancelación. De manera predeterminada autoCancelling se establece como True de forma que cuando se cancela una herramienta, la cancelación se produce después de la línea actual. Si autoCancelling se ha establecido como False, la secuencia de comando seguirá ejecutándose hasta que usted elija detenerla. Cuando se ha cancelado una herramienta, la propiedad isCancelled de solo lectura cambiará de False a True.

PropiedadDescripción

arcpy.env.autoCancelling

Cuando autoCancelling está establecida como True, la cancelación finalizará la secuencia de comandos en la línea actual. Si está como False, la cancelación establecerá la propiedad isCancelled como True y seguirá ejecutándose. autoCancelling está establecida como True de manera predeterminada.

arcpy.env.isCancelled

Cuando autoCancelling está establecida como False y la herramienta se ha cancelado, isCancelled se establecerá como True. isCancelled está como False de manera predeterminada y es una propiedad de solo lectura.

El ejemplo siguiente representa una herramienta de demostración que utiliza una serie de tablas, hace una copia y fusiona las tablas intermedias. Si autoCancelling se deja en su valor predeterminado de True, cuando se cancela, la secuencia de comandos se detendrá después de la línea actual. La naturaleza de esta herramienta en particular es que crea varias tablas intermedias que queremos limpiar en cualquier caso, incluida una cancelación. Al establecer autoCancelling como False, la cancelación se retrasa y la secuencia de comandos puede buscar un intervalo o lugar del código que elegimos evaluando la propiedad isCancelled. Una vez que isCancelled ha pasado a True, sabemos que la herramienta se ha cancelado y los datos intermedios se eliminarán antes de finalizar.

import arcpy
arcpy.env.autoCancelling = False
class CustomCancelException(Exception):
    """Custom exception for geoprocessing tool cancellations"""
    pass
def my_function(tables, output):
    temp_tables = []
    try:
        for table in tables:
            temp_tables.append(arcpy.CopyRows_management(table, '#')[0])
            # If isCancelled is True this means that the cancel button
            # has been pressed
            if arcpy.env.isCancelled:
                raise CustomCancelException('Tool has been cancelled')
        arcpy.Merge_management(tables, output)
    except CustomCancelException as err:
        arcpy.AddError(err)
    finally:
        # If tool is cancelled or finishes successfully, clean up intermediate data
        if temp_tables:
            for temp_table in temp_tables:
                arcpy.Delete_management(temp_table)
      
if __name__ == '__main__':
    inputs = arcpy.GetParameter(0)
    out_fc = arcpy.GetParameterAsText(1)
    my_function(inputs, out_fc)