モデルを 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 の予約済みのキーワードとなっている名前 (class、global、return など) を付けないようにします。予約済みキーワードを一覧表示するには、Python の keyword モジュールの kwlist プロパティを使用してください。
- 互換性のない文字を含む変数名 (Input Features A_ [({*^%$#@!&*,.";:/\ など) が整合チェックされ、Input_Features_A_ になります。互換性のない文字を含む変数値は、そのまま保持されます (Input_Features_A_ = "A_ [({*^%$#@!&*,.\";:/\\" など)。データ エレメントに Python と互換性のないの名前 (class、global、return など) を付けないようにします。予約済みキーワードを一覧表示するには、Python の keyword モジュールの kwlist プロパティを使用してください。
変数置換
- [属性検索 (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% など) は、文字列として渡されます。
データ タイプ
- 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 にエクスポートされます。エクスポートされるスクリプトは、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]