了解脚本工具中的取消行为

工具运行时,可以使用“取消”按钮停止工具继续处理。 默认情况下,取消脚本工具或 Python 工具箱工具时,将取消当前代码行之后的脚本,工具将无法运行并会出现相应的错误消息 ('Cancelled script <tool_name>... (<tool_name>) aborted by User.')。出现此消息时,说明取消将不可更改;无法执行取消后的任何代码。对于一些脚本,这正是其所需要的,但在其他情况下,取消以后可能还需要进行一些步骤来清理数据、提供自定义工具信息或其他行为。

arcpy.env 类包括两个用于控制取消行为的属性:autoCancellingisCancelled。默认情况下,将 autoCancelling 设置为 True,因此在取消工具时,将取消当前行之后的脚本。如果已将 autoCancelling 设置为 False,则脚本会在您选择停止前继续运行。如果已经取消工具,只读 isCancelled 属性将由 False 切换为 True

属性描述

arcpy.env.autoCancelling

如果将 autoCancelling 设置为 True,则取消将结束当前行上的脚本。如果设置为 False,则取消会将 isCancelled 属性设置为 True,然后继续执行。默认情况下,autoCancelling 会被设置为 True

arcpy.env.isCancelled

如果已将 autoCancelling 设置为 False 并且已取消工具,则 isCancelled 将被设置为 True。默认情况下,isCancelledFalse,且为只读属性。

以下示例介绍了一个演示工具,其可选取一系列表、执行复制并可将那些中间表合并到一起。如果将 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)