Création de scripts Python

La plupart des outils de script Python qui s’exécutent correctement sur votre ordinateur sont publiés et exécutés en tant qu’outil Web sur ArcGIS Enterprise ou en tant que service de géotraitement sur un site ArcGIS Server autonome, sans qu’il soit nécessaire de modifier le script d’une quelconque manière.

Création des chemins d’accès aux données de projet

La construction appropriée des chemins qui référencent des données constitue une part importante de nombreux scripts Python. Ceci inclut les données de projet (données en entrée non exposées en tant que paramètres de l’outil) qui se trouvent à l’intérieur des scripts, ainsi que les données intermédiaires (temporaires). Vous pouvez écrire des chemins d’accès dans Python qui référencent des données de différentes façons. Reportez-vous à la rubrique Définition des chemins d’accès aux données dans Python pour savoir comment écrire un chemin complet.

Un chemin d’accès aux données relatives à un emplacement connu peut se construire avec os.path.join. Ceci est également utile pour construire des chemins d’accès à des emplacements en sortie figurant dans l’espace de travail en mémoire ou pour utiliser des emplacements temporaires pour des données temporaires sur le disque. Consultez l’exemple ci-dessous avec os.path.join.

Lorsque vous partagez un outil en tant qu’outil Web, le script est numérisé et chaque chaîne (entre guillemets simples ou doubles) utilisée dans une variable Python ou en tant qu’argument d’une fonction est testée pour vérifier si la chaîne correspond à un chemin d’accès aux données existantes. Les données de projet, dans ce cas, impliquent les notions suivantes :

  • une couche dans la table des matières d’une carte ou scène,
  • un dossier,
  • un fichier,
  • un jeu de données géographiques, tel qu’une classe d’entités, une géodatabase, une carte (.mapx) ou un fichier de couche (.lyrx).

Lorsqu’une chaîne est identifiée dans le script, le test visant à vérifier l’existence de données répond aux questions suivantes :

  • La chaîne fait-elle référence à une couche dans la fenêtre Contenu ?
  • La chaîne contient-elle un chemin absolu d’accès aux données, tel que "e:\Warehousing\ToolData\SanFrancisco.gdb\streets" ?
  • La chaîne fait-elle référence à des données que l’on peut rechercher par rapport à un emplacement connu, tel que le fichier de projet .aprx ou au script ?

Ces tests se déroulent suivant un ordre séquentiel. Si le test est réussi et que les données existent, les données sont consolidées sauf dans le cas suivant : si les données ont été inscrites auprès du stockage des données fédéré du portail, elles ne sont pas consolidées.

Remarque :

Lorsque les dossiers sont consolidés, seuls les fichiers et les jeux de données géographiques du dossier sont copiés, pas les sous-dossiers du dossier. Certains jeux de données géographiques, tels que les géodatabases fichier et les rasters sont des dossiers techniquement parlant, mais comme ils sont aussi des jeux de données géographiques, ils sont copiés. Si le dossier contient des fichiers de couche (.lyrx) ou des cartes (.mapx), toutes les données référencées par le fichier de couche ou la carte sont également consolidées de manière à ce que n’importe quelle routine arcpy.mp du script puisse accéder aux données référencées.

Conseil :

Du fait du mode de consolidation des dossiers, il est préférable de ne pas encombrer le dossier avec des jeux de données et des fichiers volumineux qui ne seront jamais utilisés par l’outil. En effet, le volume des données à empaqueter ou à télécharger sur le serveur augmenterait inutilement. (Cette règle ne s’applique pas aux dossiers du stockage des données d’un serveur puisque ces dossiers ne sont pas chargés sur le serveur.)

Exemple

L'exemple suivante repose sur la structure de dossier de ce projet :

Exemple de projet

Chemins relatifs aux jeux de données et dossiers

Une routine arcpy.mp permet d’obtenir le chemin homeFolder ou defaultGeodatabase pour un projet donné. Les chemins peuvent être construits avec le module os de Python. Dans l’exemple suivant, une classe d’entités dans la géodatabase WebTools.gdb est définie et symbolisée à l’aide d’un fichier de couche dans le dossier LYRXs :


import arcpy
import os

# The ArcGIS Project is used to build paths from the defaultGeodatabase and 
# homeFolder using os.path.join

# Reference the CURRENT project with ArcGIS Pro open, or point to an .aprx on 
# disk
prj = arcpy.mp.ArcGISProject("CURRENT")
arcpy.management.CopyFeatures(os.path.join(prj.defaultGeodatabase, "study_sites"), 
                              "memory/tempSite")

# Create a variable to reference the LYRX folder
lyrxFolder = os.path.join(prj.homeFolder, "LYRXs")
arcpy.management.ApplySymbologyFromLayer("memory/tempSite", 
                                         os.path.join(lyrxFolder, "Site4.lyrx"))

Dans le code ci-dessus, la classe d’entités study_sites et le fichier Site4.lyrx (ainsi que les données vers lesquelles il pointe) sont testés dans le but de vérifier si les données de référence existent. Ces jeux de données sont consolidés et chargés sur le serveur (sauf si le dossier dans lequel ils se trouvent a été référencé dans le cadre du stockage des données du serveur).

La variable lyrxFolder fait référence à un chemin relatif vers un dossier de fichiers de couche. Ce dossier sera consolidé, c’est-à-dire que tout son contenu (à l’exception des sous-dossiers comme indiqué plus haut) sera empaqueté ou chargé sur le serveur (sauf si le dossier lyrxFolder fait partie du stockage des données du serveur).

Référencer des couches en tant que données de projet

Ce processus moins courant, qui consiste à utiliser des couches en tant que données de projet, peut entraîner une amélioration des performances d’un outil de script Python. Le code Python ci-dessus utilise les chemins d’accès entiers aux classes d’entités et aux fichiers de couche. Lorsqu’un outil Web est exécuté, il doit d’abord ouvrir le jeu de données. L’ouverture d’un jeu de données induit un coût en termes de performances. L’utilisation des couches dans un script permet de conserver les données ouvertes et en cache pour une implémentation plus rapide. L’image suivante présente la manière dont les couches du contenu du projet sont appariées et utilisées dans le script Python :

Couches utilisées dans l'outil de script Python

Les variables (extentMask et rasterLayer) pointent vers des chaînes simples qui correspondent aux noms des couches dans la carte. Les données sont consolidées et disponibles dans l’outil Web en cas de partage sur votre portail (si elles ne sont pas référencées dans le stockage des données). Une référence aux couches en mémoire est également maintenue. Cet appariement de nom des couches sur la carte vers les chaînes d’un script permet aux outils de fonctionner avec les couches.

Remarque :

Lorsque vous utilisez les couches en tant que données de projet internes dans un outil de script, ce dernier devient dépendant de la carte associée. Vous ne pouvez pas exécuter l’outil dans une autre carte si ces couches ne sont pas présentes. Ce modèle permet de réduire la portabilité générale d’un outil de script et convient donc mieux à la création d’outils Web.

Importer d’autres modules Python

Un script peut importer d’autres scripts développés par vos soins. Par exemple, le code suivant illustre l’importation d’un module Python nommé myutils.py, qui se trouve dans le même répertoire que le script parent et qui inclut une méthode nommée getFIDName.


import arcpy
import myutils

inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)

Lorsqu’une instruction import est identifiée, la commande suivante est utilisée pour localiser le script :

  1. Dossier identique à celui du script. Si le script est incorporé dans la boîte à outils, le dossier qui contient la boîte à outils est utilisé.
  2. Dossier référencé par la variable d’environnement système PYTHONPATH.
  3. Tout dossier référencé par la variable d’environnement système PATH.
Si le script utilisé pour l'import se trouve dans l'un de ces dossiers, le script est consolidé. Le processus d'analyse est récursif, le script importé est également analysé afin de rechercher les données de projet et les imports à l'aide de toutes les règles détaillées plus haut.

Une autre technique de référencement des modules à importer consiste à utiliser la méthode sys.path.append. Cette méthode permet de définir un chemin d'accès à un dossier contenant les scripts que vous devez importer.


import arcpy
import sys
import os

# Append the path to the utility modules to the system path
# for the duration of this script.
myPythonModules = r'e:\Warehousing\Scripts'
sys.path.append(myPythonModules)
import myutils  # A Python file within myPythonModules

Dans le code ci-dessus, la méthode sys.path.append nécessite un dossier en tant qu’argument. Comme r'e:\Warehousing\Scripts' est un dossier, l’intégralité du contenu du dossier est consolidée. Les règles de copie du contenu d'un dossier s'appliquent également dans ce cas, tout le contenu du dossier est copié à l'exception des sous-dossiers qui ne correspondent pas à des jeux de données géographiques.

Remarque :

Les scripts Python contenus dans le dossier ne sont pas analysés en vue de l’identification des données de projet ou des modules importés.

Modules tiers

Les modules tiers et les bibliothèques (à savoir les modules ne faisant pas partie de l’installation de base de Python) ne sont pas consolidés. Vous devez vous assurer que le module existe et s’exécute correctement sur le serveur. Cela ne s’applique pas aux modules numpy, matplotlib ainsi qu’aux autres modules installés avec votre serveur fédéré exécutant ArcGIS Server par défaut. Pour déployer des modules Python tiers, reportez-vous à la rubrique Déployer des paquetages Python personnalisés pour ArcGIS Server.

Code de validation d'un outil

Les outils de script prennent en charge la logique de validation d’outil personnalisé. La validation prend en charge des comportements tels que l’activation et la désactivation des paramètres, la fourniture de valeurs par défaut et la mise à jour des mots-clés de chaîne. Sans la fonction de validation, la logique de validation d’outil personnalisé ne donne pas plus de valeurs aux clients de l’outil Web. Toutefois, avec la fonction de validation, les clients peuvent avoir une expérience de validation similaire en exécutant un outil Web plutôt qu’en exécutant l’outil en local.

Fonction Validation

Lorsqu’un client envoie une demande de validation à un outil Web ou un service de géotraitement, la classe ToolValidator s’exécute. Pour améliorer l’expérience des utilisateurs de l’outil, écrivez uniquement le code de validation de traitement rapide. Même si vous pouvez utiliser le code de validation pour ouvrir un jeu de données ou modifier une valeur ou la structure d’une entité ou d’une entrée de table, la validation est lente et ne renvoie pas l’entité ou la table modifiée à l’utilisateur de l’outil Web.

Les validations personnalisées fréquemment utilisées ci-dessous sont intégralement prises en charge par la fonction de validation. D’autres fonctions de validation sont également prises en charge par Python, sauf la modification de la valeur d’une entité, d’une table ou d’un raster en entrée.

Mettre à jour le filtre d’un paramètre

Selon la valeur d’un paramètre, le filtre d’un autre paramètre est mis à jour.

def updateParameters(self):
    if self.params[0].value < 1000:
        self.params[1].filter.list = ["A4", "Letter"]
    elif self.params[0].value < 5000:
        self.params[1].filter.list = ["A3", "Tabloid"]
    else:
        self.params[1].filter.list = ["A2", "ANSI C"]
    return
Activer ou désactiver un paramètre

Si le premier paramètre a une valeur, le deuxième paramètre sera activé. Dans le cas contraire, le deuxième paramètre ne sera pas activé.

def updateParameters(self):
    if self.params[0].value:
        self.params[1].enabled = True
    else:
        self.params[1].enabled = False
    return
Mettre à jour la valeur d’un paramètre

Si un utilisateur n’a précisé aucune valeur pour le paramètre, le code de validation met à jour la valeur du paramètre avec une chaîne spécifiée.

def updateParameters(self):
    if not self.params[3].altered:
        self.params[3].value = "Default map authored by " + self.params[2].valueAsText
    return
Fournir un message personnalisé

Un message est fourni en fonction du type de géométrie de l’entrée.

def updateMessages(self):
    self.params[0].clearMessage()
        
    if self.params[0].valueAsText:
        shapetype = arcpy.Describe(self.params[0]).shapeType.lower()
        if shapetype == "point":
            self.params[0].setWarningMessage("Choosing a point layer may result long running time of the tool.")
        elif shapetype == "polygon":
            self.params[0].setErrorMessage("Polygon inputs are not supported temporarily.")
    return
Code d’initialisation de validation

Les configurations dans la fonction initializeParameters ont des répercussions sur l’outil lors de sa publication ou au redémarrage du service de géotraitement.

def initializeParameters(self):
    self.params[5].parameterDependencies = [4]
    self.params[7].category = "Detailed configurations"
return

Les clients des outils Web ne peuvent pas exécuter la logique de validation d’un outil, seul le serveur ayant cette capacité. Lorsque le client envoie sa demande de tâche d’exécution au service, la logique de validation est exécutée sur le serveur. Si la validation génère une erreur, la tâche est interrompue. Si vous êtes en train de renvoyer des messages à partir de votre service, le client ne reçoit pas les messages provenant des routines de validation. En règle générale, le code de validation d'un outil web publié est moins utile que celui d'un outil utilisé sur le Bureau. Vous pouvez utiliser une copie d’un outil Web dont le code de validation a été réduit ou supprimé, puis la partager en tant qu’outil Web. Vous devez développer la logique de validation dans l'application pour utiliser l'outil web.

La logique de validation est implémentée avec Python et le code de validation est analysé en vue de l’identification des données de projet et des modules, comme avec n’importe quel autre script Python. Par exemple, la logique de validation peut ouvrir un dossier si ce dossier n’est pas un paramètre d’outil, mais s’il s’agit de données de projet utilisées dans le script de validation de l’outil. Les mêmes règles que celles décrites ci-dessus pour les scripts Python s’appliquent ici et le dossier c est consolidé et copié sur le serveur (à moins qu’il ne figure déjà dans le Data Store du serveur).

Prise en main de Python, d’ArcPy et des outils de script

Si vous ne connaissez pas Python, ArcPy ou les outils de script, reportez-vous au tableau suivant qui contient des rubriques susceptibles de vous aider à démarrer :

Rubrique d'aideContenu

Présentation du géotraitement

Rubriques de présentation du géotraitement.

Présentation de ArcPy

Rubriques de présentation d’ArcPy.

Présentation rapide de la création d’outils dans Python

Qu'est-ce qu'un outil de script ?

Rubriques de présentation de la création d’outils de script personnalisés avec Python.

Définir les paramètres des outils de script

Dès que vous vous êtes familiarisé avec le processus de création d’un outil de script, cette rubrique explique en détail comment définir des paramètres d’outils de script.