Понятие поведения отмены в инструментах-скриптах

Во время работы инструмента доступна кнопка, отменяющая дальнейшее выполнение. По умолчанию, когда инструмент-скрипт или инструмент из набора инструментов на Python отменяется, скрипт прекращает работу с текущей строчки кода, а инструмент прекращает работу и выдаёт соответствующее сообщение об ошибке ('Cancelled script <tool_name>... (<tool_name>) прервано пользователем.'). Это окончательная отмена; после такой отмены продолжить выполнение невозможно. В некоторых скриптах больше ничего не надо; но в некоторых случаях после отмены требуется предпринять дополнительные шаги, чтобы очистить данные, выдать пользовательские сообщения инструментов и т.д.

У класса arcpy.env два свойства, autoCancelling и isCancelled для контроля за поведением отмены. По умолчанию, autoCancelling установлено на True, чтобы после отмены работы инструмента работа прекратилась после данной строчки. Если autoCancelling установлено на False, скрипт будет продолжать выполняться, пока вы его не остановите. При прерывании инструмента доступное только для чтения свойство isCancelled переключится с False на True.

СвойствоОписание

arcpy.env.autoCancelling

Если autoCancelling задано как True, отмена приведет к окончанию скрипта в текущей строке. Если False, отмена задаст свойство isCancelled как True и продолжит выполнение. autoCancelling установлено как True по умолчанию.

arcpy.env.isCancelled

Если autoCancelling задано как False, и инструмент отменен, isCancelled будет задано как True. isCancelled установлено False по умолчанию, это свойство только для чтения.

Следующий пример представляет образец инструмента, который берёт несколько таблиц, делает копию и сливает промежуточные таблицы друг с другом. Если в autoCancelling оставлено значение по умолчанию True, в случае отмены скрипт остановится после текущей строчки. Природа данного инструмента такова, что он создаёт серию промежуточных таблиц "за кадром", и нам надо очистить их в любом случае, в том числе после прерывания. Если установить autoCancelling на False, отмена приостанавливается и скрипт может просмотреть любой промежуток или место в коде, которые мы выбрали, отметив свойство isCancelled. Если isCancelled обращено в True, мы знаем, что инструмент прекратил работу, но сначала будут удалены промежуточные данные.

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)