Empaquetage de scripts Python

Approfondissement :

La majorité de outils de script Python qui s'exécutent avec succès sur votre ordinateur s'empaquettent et s'exécutent avec succès quand ils sont décompressés sur une autre machine, sans qu'il y ait besoin de modifier le script d'une quelconque manière. Toutefois, si vous rencontrez des problèmes, c'est peut-être que votre script utilise des chemins codés d'accès aux données ou des instructions import pour importer des modules Python que vous avez développés. Dans ce cas, il est recommandé de lire cette rubrique qui traite en détail des sujets suivants.

  1. Procédure d'identification et d'inclusion dans un paquetage des données comportant des chemins codés.
  2. Procédure d'identification et d'inclusion dans un paquetage des modules importés.
  3. Procédure d'empaquetage du code de validation d'un outil.
  4. Procédure d'empaquetage de bibliothèques tierces.

Procédure d'identification des données dans votre script

Chaque fois que vous partagez un résultat, que ce soit en tant que paquetage ou service, et que le résultat fait référence à un outil de script, cet outil est analysé afin de rechercher toutes les données utilisées dans le script. Lorsqu'un chemin d'accès aux données est identifié, il est consolidé dans un dossier temporaire qui est intégré dans un paquetage.

A l'issue de l'analyse du script, 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 afin de vérifier que la chaîne correspond à un chemin d'accès aux données existantes. Dans ce cas, on entend par données

  • une couche de carte,
  • un dossier,
  • un fichier,
  • un jeu de données géographiques, tel qu'une classe d'entités, un fichier de formes, une géodatabase ou un fichier de couche.

Dans le cadre de cette discussion, seules les données utilisées en entrée dans les outils de géotraitement ou chemins faisant référence à d'autres modules Python méritent notre attention. Les données en sortie sont également consolidées.

Chaque fois qu'une chaîne entre guillemets est identifiée dans le script, le test visant à vérifier l'existence de données se déroule comme suit :

  1. La chaîne fait-elle référence à une couche de carte ?
  2. La chaîne contient-elle un chemin absolu d'accès aux données, tel que e:\Warehousing\ToolData\SanFrancisco.gdb\streets ?
  3. La chaîne fait-elle référence à des données que l'on peut rechercher par rapport à l'emplacement du script ? L'emplacement du script est défini comme suit :
    • Dossier contenant le script.
    • Si le script est incorporé dans la boîte à outils, l'emplacement correspond au dossier qui contient la boîte à outils.
    • Si le script se trouve dans une boîte à outils Python, l'emplacement correspond au dossier qui contient la boîte à outils Python.

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.

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, les rasters et les TIN 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, toutes les données référencées par le fichier de couche 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 votre outil. En effet, le volume des données à empaqueter augmenterait inutilement.

Exemples

Les exemples ci-après reposent sur cette structure de dossier :

Exemple de dossier de projet
Exemple de dossier de projet

Chemins relatifs et dossiers

La technique suivante d'identification des données par rapport à l'emplacement du script correspond à un schéma classique. Pour information, le code de script qui suit réside dans le dossier Scripts illustré ci-dessus. Le dossier ToolData contient SanFrancisco.gdb. SanFrancisco.gdb renferme une classe d'entités nommée Streets. Dans l'échantillon de code ci-après, le chemin d'accès au dossier ToolData est construit par rapport à l'emplacement du script (le dossier Scripts).

import arcpy
import os
import sys
# Get the pathname to this script, then strip off the
#  script file name to yield the containing folder
#
scriptPath = sys.path[0]
thisFolder = os.path.dirname(scriptPath)
# Construct paths to ../ToolData/SanFrancisco.gdb/Streets and
#                    ../ToolData/Warehouse.lyr
#
toolDataPath = os.path.join(thisFolder, "ToolData")
streetFeatures = os.path.join(toolDataPath, "SanFrancisco.gdb", "Streets")
streetLyr = os.path.join(toolDataPath, "Warehouse.lyr")

Dans le code ci-dessus, la chaîne "ToolData" (un argument de la fonction os.path.join) est testée afin de vérifier si les données existent. Dans ce cas, il existe un dossier appelé ToolData, par rapport à l'emplacement du script. Ce dossier ToolData est consolidé, c'est-à-dire que tout son contenu (à l'exception des sous-dossiers comme indiqué plus haut) est empaqueté.

Il convient de noter que c'est le contenu de ce dossier qui est copié, et non pas les fichiers individuels. Par exemple, dans le code ci-dessus, le chemin d'accès au jeu de données e:/Warehousing/ToolData/SanFrancisco.gdb/Streets est créé. Le processus de consolidation ne permet pas d'isoler et de copier uniquement le jeu de données Streets, il copie l'intégralité du dossier ToolData.

Chemin absolu d'accès à un jeu de données géographiques

On appelle chemin absolu un chemin qui commence par la lettre d'une unité, comme e:/, comme illustré dans l'échantillon de code ci-après.

streetFeatures = 'e:/Warehousing/ToolData/SanFrancisco.gdb/Streets'

Dans le code ci-dessus, le jeu de données Streets et toutes les autres données dont il dépend (comme les classes de relations et les domaines) seront consolidés.

Exemple hybride

toolDataPath = r'e:\Warehousing\ToolData' warehouseLyr = os.path.join(toolDataPath, "Warehouse.lyrx")

Dans le code ci-dessus, l'intégralité du contenu du dossier ToolData est consolidé. Comme le contenu du dossier (en dehors des sous-dossiers) est consolidé, Warehouse.lyrx est également consolidé, ainsi que toutes les données auxquelles Warehouse.lyrx fait référence.

Barres obliques et barres obliques inverses

La convention propre à Windows stipule l'utilisation d'une barre oblique inverse (\) comme séparateur dans un chemin. Les systèmes UNIX utilisent une barre oblique (/).

Remarque :

Dans ArcGIS, cela n'a pas d'importance que vous utilisiez une barre oblique ou une barre oblique inverse dans votre chemin. ArcGIS transpose toujours les barres obliques et les barres obliques inverses selon la convention de système d'exploitation appropriée.

Barres obliques inverses dans les scripts

Les langages de programmation qui ont leurs racines dans UNIX et le langage de programmation C, tel que Python, utilisent la barre oblique inverse (\) comme caractère d'échappement. Par exemple, \t correspond à une tabulation. Comme les chemins peuvent contenir des barres obliques inverses, vous devez empêcher l'utilisation de la barre oblique inverse comme caractère d'échappement. La méthode la plus simple consiste à convertir les chemins en chaînes brutes Python à l'aide de la directive r, comme illustré ci-dessous. Cela indique à Python d'ignorer les barres obliques inverses.

thePath = r"E:\data\telluride\newdata.gdb\slopes"

Importation d'autres modules Python

Votre script peut importer d'autres scripts développés par vos soins. Par exemple, le code ci-dessous illustre l'importation d'un module Python intitulé myutils.py, qui se trouve dans le même répertoire que le script parent, et qui contient une routine nommée getFIDName.

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

Chaque fois qu'une instruction import est identifiée, la commande suivante est utilisée pour identifier le script :

  • 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é.
  • Dossier référencé par la variable d'environnement système PYTHONPATH.
  • 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, il convient de noter que la méthode sys.path.append nécessite un dossier en tant qu'argument. Comme 'e:\Warehousing\Scripts' est un dossier, l'intégralité du contenu du dossier sera consolidé. 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 Pyhton contenus dans le dossier ne sont pas analysés pour identifier les données de projet ou les modules importés.

Code de validation d'un outil

Si vous avez l'habitude d'écrire des outils de script, vous pouvez fournir votre propre logique de validation d'outil. La logique de validation est implémentée avec Python et le code de validation est analysé pour identifier les données de projet et les modules, comme pour tout autre script Python. Par exemple, la logique de validation peut ouvrir un dossier (par exemple, d:\approved_projections) contenant des fichiers de projection (.prj) pour créer une liste de choix de références spatiales à l'intention des utilisateurs qui exécutent l'outil. Ce dossier n'est pas un paramètre d'outil ; il s'agit simplement d'un chemin d'accès aux données 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 : le dossier d:\approved_projections est consolidé et intégré dans le paquetage.

Bibliothèques tierces

Les modules tiers (à 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 est installé sur la machine où le paquetage est décompressé. Vous devez fournir une documentation relative à votre outil et à votre paquetage qui indique les modules tiers qui sont obligatoires. Ceci ne s'applique pas aux modules tiers installés avec ArcGIS, notamment numpy, matplotlib et pandas.