Exporter un modèle vers Python

L’exportation d’un modèle vers un script Python est un moyen pratique de se familiariser avec l’utilisation des outils et des environnements dans Python. Pour exporter un modèle vers Python, cliquez sur le bouton Export (Exporter) du ruban ModelBuilder, puis sélectionnez l’une des options suivantes :

  • Exporter vers un fichier Python
  • Send To Python Window (Envoyer dans la fenêtre Python)

Ces deux options génèrent le même code Python. Il est possible d’adapter le code et de l’utiliser comme un script Python autonome, ou de modifier le code pour en faire un outil de script.

Considérations à prendre en compte pour l’exportation d’un modèle dans Python

Lors de l’exportation d’un modèle vers un script Python, plusieurs aspects sont pris en compte pour adapter le modèle au code Python. Certains de ces aspects sont présentés ci-après.

Remplacer

Par défaut, un modèle exporté vers Python définit la propriété overwriteOutput sur False. Pour pouvoir remplacer un jeu de données quelconque, il convient de définir la propriété arcpy.env.overwriteOutput sur True.

Organisation du code

Avec le script exporté, un modèle est exporté sous la forme d’une fonction et les valeurs de paramètre sont transmises sous la forme d’arguments. Voici un exemple :

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"):

Si le modèle inclut des sous-modèles, le contenu de ces derniers est exporté dans des sous-dossiers distincts. Le fichier Python principal importe et appelle correctement le fichier Python de sous-modèles lors de l’exécution du code.

Extensions

La fonction CheckOutExtension est ajoutée pour les outils qui ont besoin d’extensions.

Couches et vues tabulaires

Si le modèle utilise des couches ou des vues tabulaires qui n’ont pas été créées dans le modèle, vous devez les créer dans le script à l’aide d’outils tels que l’outil Générer une couche d’entités et l’outil Générer une vue tabulaire.

Validation

Les éléments de données du modèle sont convertis en variables dans le script Python. Les noms de variable composés de caractères incompatibles, comme [({*^%$#@!&*,.";:/\, sont validés pour exclure les caractères incompatibles. Les valeurs de variable composées de caractères incompatibles restent inchangées. Évitez de nommer des éléments de données qui sont des mots-clés réservés dans Python (par exemple, class, global et return). Pour une liste complète des mots-clés réservés, utilisez la propriété kwlist du module keyword de Python.

  • Les noms de variable composés de caractères incompatibles, comme Input Features A_ [({*^%$#@!&*,.";:/\, sont validés sous la forme Input_Features_A_. Les valeurs de variable composées de caractères incompatibles restent inchangées (par exemple, Input_Features_A_ = "A_ [({*^%$#@!&*,.\";:/\\"). Évitez de nommer des éléments de données qui seront incompatibles dans Python (par exemple, class, global et return). Pour une liste complète des mots-clés réservés, utilisez la propriété kwlist du module keyword de Python.

Substitution de variables

Les modèles contenant une substitution de variables en ligne sont exportés dansPython comme indiqué ci-dessous :

  • La substitution de variables en ligne Type = ’%Name%’ dans un générateur d’expressions pour des outils tels que l’outil Select Layer By Attribute (Sélectionner une couche par attributs) est exportée sous la forme where_clause=f"Type = '{Name}'".
  • La substitution de variables en ligne pour un espace de travail %Output Workspace%\a ou %scratchGDB%\b est exportée sous la forme OutputFC = fr"{Output_Workspace}\a" et la forme OutputFC = fr"{arcpy.env.scratchGDB}\b".
  • La substitution de variables en ligne système, comme %n% et %i%, est transmise sous forme de chaîne.
  • Une variable avec substitution de variables en ligne et définie comme paramètre de modèle est évaluée à l’aide des fonctions Python intégrées locals(), globals() et isinstance() lorsqu’elle est exportée dans Python. Par exemple :
    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")

Types de données

Les types de données du modèle, lorsqu’ils sont exportés dans Python, sont appariés comme suit :

  • Les valeurs des variables de modèle des types de données String (Chaîne), Long (Long), Double (Double) et Boolean (Booléen) sont appariées aux types de données Python. Toutes les autres valeurs de type de données sont mappées sous forme de chaînes dans Python.
  • Les valeurs des paramètres de la table de valeurs sont appariées sous forme de liste. Par exemple :
    arcpy.Statistics_analysis(in_table=a, out_table=b, statistics_fields=[["Type", "COUNT"], ["Year", "COUNT"]], case_field=["Type"])
  • Les paramètres d’appariement de champ, tels que le paramètre Field Map (Appariement de champ) de l’outil Add (Ajouter), sont convertis en chaîne délimitée par des points-virgules, comme suit :
    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)

Environnements

Seuls les paramètres d’environnement modifiés à partir de la valeur par défaut sont exportés vers Python pour l’application, le modèle et l’outil. Le script exporté définit les environnements en utilisant la classe EnvManager dans un bloc with. Les valeurs de paramètres d’environnement sont temporaires et définies uniquement pour la durée du bloc 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()

Flux de modèle

  • Les conditions préalables (préconditions) des modèles sont converties en un bloc « 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")
  • Les boucles de rétroaction des modèles sont transposées dans le flux du script.

Outils de modèles

Les outils de modèles Iterators (Itérateurs), Utilities (Utilitaires) ou Logical (Logique) ne sont pas exportés dans Python. Il vous faut ajouter les fonctions Python équivalentes proposées par ces outils. Par exemple, vous devez utiliser la logique « if/else » pour exécuter un branchement conditionnel dans votre script.

Sorties dérivées

Les valeurs de sortie dérivée sont attribuées aux variables en indexant l’objet Result d’un outil de géotraitement, comme suit :

output = arcpy.JoinField_management(in_data=infc, in_field="Type", join_table=joinTable, join_field="Type", fields=["Year"])[0]