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 関数が追加されます。

レイヤーとテーブル ビュー

モデルが、モデル内で作成していないレイヤーやテーブル ビューを使用する場合、[フィーチャ レイヤーの作成 (Make Feature Layer)][テーブル ビューの作成 (Make Table View)] などのツールを使用して、それらのレイヤーやテーブル ビューをスクリプト内に作成する必要があります。

検証

モデルのデータ エレメントは、Python スクリプト内の変数に変換されます。 互換性のない文字 ([({*^%$#@!&*,.";:/\ など) を含む変数名が検証され、互換性のない文字が除外されます。 互換性のない文字を含む変数値は、そのまま保持されます。 データ エレメントに Python の予約済みのキーワードとなっている名前 (classglobalreturn など) を付けないようにします。 予約済みキーワードを一覧表示するには、Pythonkeyword モジュールの kwlist プロパティを使用してください。

  • 互換性のない文字を含む変数名 (Input Features A_ [({*^%$#@!&*,.";:/\ など) が検証され、Input_Features_A_ になります。 互換性のない文字を含む変数値は、そのまま保持されます (Input_Features_A_ = "A_ [({*^%$#@!&*,.\";:/\\" など)。 データ エレメントに Python と互換性のないの名前 (classglobalreturn など) を付けないようにします。 予約済みキーワードを一覧表示するには、Pythonkeyword モジュールの kwlist プロパティを使用してください。

変数置換

インライン変数置換を含むモデルは、以下のように Python にエクスポートされます。

  • [属性検索 (Select Layer By Attribute)] などのツールの式の設定におけるインライン変数置換 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"])
  • フィールド マッピング パラメーター ([アペンド (Append)] ツールの [フィールド マップ] パラメーターなど) は、次のように、セミコロン区切りの文字列に変換されます。
    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]