En vous appuyant sur les utilitaires de distribution Python (distutils), les boîtes à outils Python et les boîtes à outils personnalisées contenant des modèles et/ou des outils de script Python peuvent être distribués efficacement aux utilisateurs ArcGIS sous la forme de modules Python. Le processus de création et de distribution de ces boîtes à outils commence avec la création du module Python. Le module utilisé dans cet exemple sera foo.py.
foo.py
Exemple de code destiné à créer le module Python foo :
import os
def hello():
print('Hello ' + os.getenv('username'))
Pour que le module soit créé et distribué correctement, une structure de répertoire spécifique doit exister. Vous devez créer un répertoire nommé foo pour stocker le module foo. La distribution nécessitant que le module foo soit contenu dans un répertoire parent, un répertoire nommé src est créé pour contenir le répertoire foo et le module foo. La structure du répertoire doit être la suivante :

Pour que le module foo s'initialise et exécute automatiquement certain code une fois qu'il a été importé, il nécessite un fichier __init__.py. Une fois le fichier __init__.py en place, les utilisateurs ont la possibilité d'accéder au module foo et d'importer des définitions sélectionnées.
__init__.py
Exemple de code destiné à créer le module __init__.py pour foo :
from foo import hello
La structure du répertoire doit maintenant être la suivante :

Une fois les fichiers et la structure de répertoire en place, le module foo peut être importé via import foo et foo.hello() peut être appelé et exécuté. L'étape suivante consiste à créer un paquetage de distribution pour le module foo afin qu'il soit installé dans le répertoire Python site-packages pour en faciliter le partage. Pour ce faire, écrivez un script setup.py.
setup.py
Exemple de code destiné à créer setup.py :
from distutils.core import setup
setup(name='foo',
version='1.0',
packages=['foo'],
package_dir={'foo': 'foo'},
)
Le fichier setup.py définit le nom et la version du module et pointe l'utilitaire de création sur le répertoire du paquetage. Le fichier setup.py doit être enregistré dans le répertoire src. À ce stade, la structure du répertoire doit être la suivante :

Une fois la structure du répertoire en place, vous pouvez créer un programme d'installation du module foo en exécutant l'une des commandes ci-après à partir du répertoire src au moyen de l'invite de commande du système d'exploitation correspondante. Cet exemple utilise un système d'exploitation Windows.
Windows :
python setup.py bdist_wininst
Linux :
python setup.py bdist_rpm
Windows Builder crée des répertoires dist et build dans le répertoire src. Dans le répertoire dist, le fichier foo-1.0.win32.exe est créé. Il s'agit d'un fichier exécutable pouvant être distribué afin d'installer le module foo dans le répertoire Python site-packages sur un ordinateur Windows. Plutôt que d'exécuter le fichier exécutable pour installer le module foo, vous pouvez copier le répertoire foo directement du répertoire build/lib vers le répertoire Python site-packages. Si des restrictions de la part de l'utilisateur empêchent l'exécution du fichier exécutable, le fait de copier le répertoire foo directement du répertoire build/lib vers le répertoire Python site-packages produit le même résultat que lorsqu'il est installé via le fichier exécutable. Une fois le module foo installé ou copié dans le répertoire site-packages, la structure doit être la suivante :

Ce processus peut être mis en œuvre de manière à étendre les fonctionnalités de géotraitement en ajoutant des boîtes à outils personnalisées et/ou des boîtes à outils Python directement dans des boîtes à outils système ArcGIS. En tant que boîte à outils système, elle est facilement accessible dans la liste de boîtes à outils système au sein d'ArcGIS et elle peut contenir des wrappers ArcPy créés pour étendre également ArcPy. En outre, cela permet au module de boîte à outils personnalisé de tirer parti de la méthodologie bien établie que les boîtes à outils système ArcGIS déploient pour la distribution de messages, l'aide basée sur la langue et la réponse aux paramètres localisés. ArcGIS Desktop vérifie dans le répertoire Python site-packages si un répertoire nommé esri existe au sein de chaque module. Le répertoire esri contient les boîtes à outils personnalisées ainsi que leurs fichiers d'aide associés. Voici la structure du répertoire pour la langue anglaise:

Les boîtes à outils personnalisées (.tbx et .pyt) sont placées dans le répertoire esri/toolboxes avec d'éventuels scripts de prise en charge si vous utilisez des outils de création de script. Le répertoire esri/help/gp contient les métadonnées des boîtes à outils et outils (.xml) personnalisés. La convention d'attribution de nom pour les boîtes à outils est <alias de boîte à outils>_toolbox.xml et celle des outils est <nom de l'outil>_<alias de boîte à outils>.xml. Le répertoire esri/help/gp/messages contient les fichiers de messages de géotraitement (.xml). Ces fichiers de message sont utilisés dans les boîtes à outils Python pour les messages devant être internationalisés. Les fichiers de remplacement des catégories d'étiquettes de boîtes à outils et d'outils sont contenus dans le répertoire esri/help/gp/toolboxes. Grâce à la création d'une nouvelle boîte à outils Python nommée SamplePythonToolbox, il est possible d'illustrer tout le processus d'extension du géotraitement via des modules Python. Pour plus d'informations sur la création et l'utilisation de boîtes à outils Python, reportez-vous à Création d'une boîte à outils Python.
SamplePythonToolbox.pyt
Exemple de code destiné à créer la boîte à outils Python :
import arcpy
import os
import foo
class Toolbox(object):
def __init__(self):
"""Define the toolbox (the name of the toolbox is the name of the
.pyt file)."""
self.label = "Toolbox"
self.alias = "SampleToolbox"
# List of tool classes associated with this toolbox
self.tools = [SampleTool]
class SampleTool(object):
def __init__(self):
"""Define the tool (tool name is the name of the class)."""
self.label = "Sample Tool"
self.description = ""
self.canRunInBackground = False
def getParameterInfo(self):
"""Define parameter definitions"""
params = None
return params
def isLicensed(self):
"""Set whether tool is licensed to execute."""
return True
def updateParameters(self, parameters):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
return
def updateMessages(self, parameters):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
def execute(self, parameters, messages):
"""The source code of the tool."""
messages.AddMessage(os.getenv("username") + " welcome to the sample tool")
foo.hello()
return
Dans SamplePythonToolbox.pyt, le module foo a été importé et la méthode execute de la classe SampleTool a appelé la fonction hello à partir du module foo. Cette méthode est efficace pour distribuer le code Python personnalisé en tant que module et exposer ses fonctionnalités via des outils de géotraitement ArcGIS. Après avoir créé SamplePythonToolbox.pyt et configuré l'aide du panneau latéral pour la boîte à outils via les métadonnées modifiées dans le menu contextuel Description de l'élément ou après avoir créé un fichier d'aide compilée personnalisé (.chm), il doit être copié avec tous les fichiers .xml l'accompagnant depuis le répertoire dans lequel il a été créé. Dans ArcCatalog ou la fenêtre Catalogue, copiez les fichiers dans le répertoire esri/toolboxes présent dans la structure de distribution. Le répertoire esri et la structure des fichiers doivent être les suivants :

La nouvelle structure du répertoire pour la distribution doit être la suivante :

Afin de refléter ces changements dans votre distribution, vous devez modifier le fichier setup.py.
Nouveau fichier setup.py
Exemple de code d'inclusion des modifications apportées au répertoire setup.py :
from distutils.core import setup
setup(name='foo',
version='1.0',
packages=['foo'],
package_dir={'foo': 'foo'},
package_data={'foo': ['esri/toolboxes/*.*']},
)
Le nouveau fichier setup.py diffère de l'original d'une ligne, dans laquelle les données supplémentaires contenues dans le répertoire esri sont ajoutées au paquetage. Une fois le programme de création du module foo exécuté et installé, la structure de répertoire suivante est créée dans le répertoire Python site-packages :

Grâce à ArcGIS Desktop et aux utilitaires de distribution Python (Distutils), il est possible de créer et d'installer un paquetage qui étend le géotraitement avec des outils et des boites à outils personnalisés que vous pouvez visualiser et exécuter à partir de boîtes à outils système ArcGIS. Pour les distributions en anglais, rien d'autre n'est nécessaire. La rubrique Internationalisation élabore sur le sujet du processus d'extension du géotraitement pour adopter la même méthodologie que celle qu'Esri utilise pour empaqueter le module afin de le distribuer dans des langues autres que l'anglais.