Экспорт модели в Python

Экспорт модели в скрипт 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.

  • Имена переменных с неподдерживаемыми символами, такими как Входные объекты A_ [({*^%$#@!&*,.";:/\ проверяются и переименовываются как Input_Features_A_. Значения переменных с неподдерживаемыми символами будут сохранены как есть., например Input_Features_A_ = "A_ [({*^%$#@!&*,.\";:/\\". Избегайте именования элементов данных, которое несовместимо с Python (например, class, global и return). Полный список зарезервированных ключевых слов, используемых модулем Python keyword см. в свойстве kwlist.

Подстановка переменных

  • Подстановка встроенных переменных, например Type = '%Имя%' в конструкторе выражений для инструментов типа Выбрать в слое по атрибуту, экспортируется как where_clause=f"Type = '{Name}'".
  • Подстановка встроенной переменной для рабочей области %Выходная рабочая область%\a или %scratchGDB%\b будет экспортирована как OutputFC = fr"{Output_Workspace}\a" и OutputFC = fr"{arcpy.env.scratchGDB}\b".
  • Системные встроенные переменные, такие как %n%, %i% переносятся как строки.

Типы данных

  • Типы данных переменных модели 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)

Параметры среды

Только настройки параметров среды, измененные по сравнению со значениями по умолчанию, будут экспортированы в модель. Экспортируемый скрипт устанавливает параметры среды с использованием класса EnvManager в блоке with; настройки параметров среды временные, и действуют только во время исполнения блока 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]