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