将模型导出到 Python 脚本可帮助您了解如何在 Python 中使用工具和环境。 要将模型导出到 Python,请单击 ModelBuilder 功能区上的导出按钮并选择以下选项之一:
- 导出为 Python 文件
- 发送到 Python 窗口
以上两个选项将生成相同的 Python 代码。 可以进一步编辑该代码并将其用作独立 Python 脚本,也可以对其进行修改以用作脚本工具。
模型 Python 导出的注意事项
将模型导出到 Python 脚本时,要使模型适应 Python 代码,需要考虑诸多注意事项。 下面将介绍其中一些注意事项。
覆盖
默认情况下,导出到 Python 的模型会将 overwriteOutput 属性设置为 False。 要支持覆盖任何输出数据集,请将 arcpy.env.overwriteOutput 属性设置为 True。
代码组织
借助导出的脚本,可以将模型导出为函数,并将参数值作为参数进行传递,例如:
def Model(InputFC=r"C:\Data.gdb\inFC", Output="C:\Output.gdb\outFC", Extent="1186925.51155726 -2378062.72079588 1240005.19719053 -2315230.04252389", Name="Canada Goose"):
如果模型包括子模型,则这些子模型的内容将导出至单独的子文件夹。 在代码运行过程中,主 Python 文件将正确导入并调用子模型 Python 文件。
扩展模块
针对具有扩展要求的工具添加了 CheckOutExtension 函数。
图层和表视图
如果模型使用的图层或表视图未在模型内创建,则需要使用创建要素图层和创建表视图等工具在脚本中创建这些图层或表视图。
验证
模型中的数据元素将转换为 Python 脚本中的变量。 将对具有不兼容字符(例如 [({*^%$#@!&*,.";:/\)的变量名进行验证以排除不兼容字符。 具有不兼容字符的变量值将保持不变。 避免命名在 Python 中为保留关键字的数据元素(例如 class、global 和 return)。 对于保留关键字的完整列表,请使用 Python keyword 模块的 kwlist 属性。
- 具有不兼容字符的变量名称(例如 Input Features A_ [({*^%$#@!&*,.";:/\)将被验证为 Input_Features_A_。 具有不兼容字符的变量值将保持不变,例如 Input_Features_A_ = "A_ [({*^%$#@!&*,.\";:/\\"。 避免命名在 Python 中不兼容的数据元素(例如 class、global 和 return)。 对于保留关键字的完整列表,请使用 Python keyword 模块的 kwlist 属性。
变量替换
包含行内变量替换的模型将按下方所示导出至 Python:
- 按属性选择图层等工具的表达式构建器中的行内变量替换 Type = '%Name%' 将导出为 where_clause=f"Type = '{Name}'"。
- 工作空间 %Output Workspace%\a 或 %scratchGDB%\b 的行内变量替换将导出为 OutputFC = fr"{Output_Workspace}\a" 和 OutputFC = fr"{arcpy.env.scratchGDB}\b"。
- 系统行内变量替换(例如 %n% 和 %i%)将作为字符串进行传递。
- 包含行内变量替换并且设置为模型参数的变量在导出至 Python 时会使用 Python 内置函数 locals()、globals() 和 isinstance() 进行评估,例如:
arcpy.analysis.Buffer(in_features=_Name_.__str__().format(**locals(),**globals())if isinstance(_Name_, str) else _Name_, out_feature_class=Name_Buffer, buffer_distance_or_field="10 Meters")
数据类型
导出至 Python 时,模型中的数据类型将按如下方式映射:
- String、Long、Double 和 Boolean 数据类型模型变量值将映射为 Python 数据类型。 所有其他数据类型值在 Python 中均映射为字符串。
- 值表参数值将映射为列表,例如:
arcpy.Statistics_analysis(in_table=a, out_table=b, statistics_fields=[["Type", "COUNT"], ["Year", "COUNT"]], case_field=["Type"])
- 字段映射参数(例如追加工具的字段映射参数)将转换为以分号分隔的字符串,如下所示:
field_mapping="Type \"Type\" true true false 20 Text 0 0,First,#,InputFC,Type,0,20;Year \"Year\" true true false 2 Short 0 0,First,#,InputFC,Year,-1,-1)
环境
对于应用程序、模型和工具,仅将已更改默认值的环境设置导出到 Python。 导出的脚本将使用 with 块内的 EnvManager 类来设置环境;环境设置值为临时值,并且仅针对 with 块期间进行设置。
import arcpy
def GnatcatcherHabitat(): # Gnatcatcher Habitat
# Model Environment settings
with arcpy.EnvManager(extent="3434731.64703611 -1534445.99025604 3485825.15860115 -1466080.56806995")
# Process: Buffer (Buffer)
with arcpy.EnvManager(extent="1187538.76766617 -2377527.90888239 1230418.76331601 -2319961.0344503")
arcpy.Buffer_analysis(in_features=r"C:\Data.gdb\A", out_feature_class=r"C:\Output.gdb\B", buffer_distance_or_field="500 Meters", line_side="FULL", line_end_type="ROUND", dissolve_option="NONE",dissolve_field=[], method="PLANAR")
if __name__ == '__main__':
# Global Environment settings
with arcpy.EnvManager(scratchWorkspace=r"C:\Output.gdb\", workspace=r"C:\Data.gdb\"):
GnatcatcherHabitat()
流向建模
- 模型前提条件将转换为 if 块:
if a and b: arcpy.Buffer_analysis(in_features=inFC, out_feature_class=outFC, buffer_distance_or_field="10 Meters", line_side="FULL", line_end_type="ROUND", dissolve_option="NONE", dissolve_field=[], method="PLANAR")
- 模型反馈循环将翻译成脚本流。
模型工具
模型工具迭代器、实用工具或逻辑不会导出到 Python。 您需要添加这些工具提供的等效 Python 功能。 例如,需要使用 if/else 逻辑在脚本中执行条件性分支。
派生输出
通过创建地理处理工具 Result 对象的索引,派生输出值将分配给变量,如下所示:
output = arcpy.JoinField_management(in_data=infc, in_field="Type", join_table=joinTable, join_field="Type", fields=["Year"])[0]