Anhand der Python Distribution Utilities (Distutils) können Python-Toolboxes und benutzerdefinierte Toolboxes, die Modelle und/oder Skriptwerkzeuge enthalten, effizient in Form von Python-Modulen den ArcGIS-Benutzern zur Verfügung gestellt werden. Das Erstellen und Verteilen dieser Toolboxes beginnt mit der Erstellung des Python-Moduls. In diesem Beispiel wird das Modul foo.py verwendet.
foo.py
Beispielcode zum Erstellen des Python-Moduls "foo":
import os
def hello():
print('Hello ' + os.getenv('username'))
Um das Modul richtig zu erstellen und zu verteilen, muss eine bestimmte Verzeichnisstruktur vorhanden sein. Zum Speichern des foo-Moduls muss ein Verzeichnis mit dem Namen "foo" erstellt werden. Für die Verteilung muss sich das Verzeichnis, in dem das foo-Modul gespeichert wird, in einem übergeordneten Verzeichnis befinden. Daher wird ein Verzeichnis namens src für das foo-Verzeichnis und das foo-Modul erstellt. Die Verzeichnisstruktur sollte folgendermaßen aussehen:

Damit das foo-Modul nach dem Import bestimmten Code initialisiert und automatisch ausführt, ist eine __init__.py-Datei erforderlich. Wenn __init__.py vorhanden ist, können Benutzer auf das foo-Modul zugreifen und ausgewählte Definitionen importieren.
__init__.py
Beispielcode zum Erstellen von "__init__.py" für foo:
from foo import hello
Die Verzeichnisstruktur sollte nun folgendermaßen aussehen:

Wenn die Dateien und die Verzeichnisstruktur vorhanden sind, kann das foo-Modul durch import foo importiert und foo.hello() aufgerufen und ausgeführt werden. Der nächste Schritt besteht darin, ein Verteilungspaket für das foo-Modul zu erstellen, sodass es im Python-Verzeichnis "site-packages" installiert werden kann, um problemlos freigegeben zu werden. Dies erfolgt durch Schreiben eines setup.py-Skripts.
setup.py
Beispielcode zum Erstellen von "setup.py":
from distutils.core import setup
setup(name='foo',
version='1.0',
packages=['foo'],
package_dir={'foo': 'foo'},
)
Die setup.py-Datei legt den Modulnamen und die Version fest und verweist das Erstellungs-Utility auf das Paketverzeichnis. Die setup.py-Datei sollte im src-Verzeichnis gespeichert werden. Nun sollte die Verzeichnisstruktur folgendermaßen aussehen:

Wenn die Verzeichnisstruktur vorhanden ist, kann ein Installationsprogramm für das foo-Modul erstellt werden, indem unter Verwendung der entsprechenden Eingabeaufforderung des Betriebssystems einer der folgenden Befehle im src-Verzeichnis ausgeführt wird. Dieses Beispiel wird unter dem Windows-Betriebssystem erstellt.
Windows:
python setup.py bdist_wininst
Linux:
python setup.py bdist_rpm
Der Windows-Manager erstellt die Verzeichnisse "dist" und "build" im src-Verzeichnis. Im Verzeichnis "dist" wird die Datei "foo-1.0.win32.exe" erstellt. Dies ist eine ausführbare Datei, die verteilt werden kann, um das foo-Modul im Python-Verzeichnis "site-packages" auf einem Windows-Computer zu installieren. Als Alternative zum Ausführen der Datei für die Installation des foo-Moduls kann das Verzeichnis "foo" auch vom Verzeichnis build/lib in das Python-Verzeichnis "site-packages" kopiert werden. Wenn Einschränkungen für Benutzer bestehen, die die Ausführung einer ausführbaren Datei nicht zulassen, wird beim Kopieren des Verzeichnisses "foo" vom Verzeichnis build/lib in das Verzeichnis "site-packages" der gleiche Effekt erzielt wie beim Installieren durch die ausführbare Datei. Nachdem das foo-Modul im Verzeichnis "site-packages" installiert oder dorthin kopiert wurde, sollte die Struktur folgendermaßen aussehen:

Dieser Prozess kann weiter implementiert werden, um Geoverarbeitungsfunktionen zu erweitern, indem benutzerdefinierte Toolboxes und/oder Python-Toolboxes den ArcGIS-System-Toolboxes direkt hinzugefügt werden. Als System-Toolbox kann sie in der Liste der System-Toolboxes in ArcGIS direkt aufgerufen werden und ArcPy-Wrapper erstellen, um ArcPy ebenso zu erweitern. Dadurch kann das benutzerdefinierte Toolbox-Modul außerdem die Vorteile der wirksamen Methode nutzen, die ArcGIS-System-Toolboxes für die Meldungsverteilung, sprachbasierte Hilfe und Antwort auf lokalisierte Einstellungen bietet. ArcGIS Desktop durchsucht das Python-Verzeichnis "site-packages", um zu ermitteln, ob in jedem Modul ein Verzeichnis mit dem Namen "esri" vorhanden ist. Das Verzeichnis "esri" enthält die benutzerdefinierten Toolboxes mit den verknüpften Hilfedateien. Nachfolgend finden Sie die Verzeichnisstruktur für die englische Sprache:

Bei Verwendung von Skriptwerkzeugen werden benutzerdefinierte Toolboxes (.tbx und .pyt) sowie alle unterstützenden Skripte im Verzeichnis esri/toolboxes abgelegt. Im Verzeichnis esri/help/gp sind die Toolbox- und Werkzeug-Metadaten (.xml) für benutzerdefinierte Toolboxes und Werkzeuge gespeichert. Die Benennungsregel für die Toolbox lautet "<Tolbox-Alias>_toolbox.xml" und die Benennungsregel für jedes Werkzeug lautet "<Werkzeugname>_<toolbox alias>.xml". Im Verzeichnis esri/help/gp/messages werden alle Geoverarbeitungsmeldungsdateien (.xml) gespeichert. Diese Meldungsdateien werden in den Python-Toolboxes für Meldungen verwendet, die internationalisiert werden müssen. Die Override-Dateien der Toolbox- und Werkzeugbeschriftungskategorien befinden sich im Verzeichnis esri/help/gp/toolboxes. Durch die Erstellung einer neuen Python-Toolbox namens SamplePythonToolbox, kann der gesamte Prozess der Geoverarbeitungserweiterung durch Python-Module demonstriert werden. Weitere Informationen zum Erstellen und Arbeiten mit Python-Toolboxes finden Sie unter Erstellen einer neuen Python-Toolbox.
SamplePythonToolbox.pyt
Beispielcode zum Erstellen einer Python-Toolbox:
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
Das foo-Modul wurde in die SamplePythonToolbox.pyt importiert und die Ausführungsmethode der SampleTool-Klasse hat die Funktion hello aus dem foo-Modul aufgerufen. Dies ist eine effiziente Möglichkeit, benutzerdefinierten Python-Code als Modul zu verteilen und die entsprechenden Funktionen durch ArcGIS-Geoverarbeitungswerkzeuge bereitzustellen. Nachdem die SamplePythonToolbox.pyt erstellt und die Hilfe im Seitenbereich durch die im Kontextmenü Elementbeschreibung bearbeiteten Metadaten für die Toolbox konfiguriert oder eine benutzerdefinierte kompilierte Hilfedatei (.chm) erstellt wurde, muss sie mit den zugehörigen .xml-Dateien aus dem Verzeichnis kopiert werden, in dem sie erstellt wurde. Kopieren Sie die Dateien mit ArcCatalog oder über das Fenster Katalog in das Verzeichnis esri/toolboxes, das in der Verteilungsstruktur vorhanden ist. Das Verzeichnis "esri" und das Datei-Layout sollten folgendermaßen aussehen:

Die neue Verzeichnisstruktur für die Verteilung sollte folgendermaßen aussehen:

Um diese Änderungen in der Verteilung wiederzugeben, muss die setup.py-Datei bearbeitet werden.
Die neue setup.py-Datei
Beispielcode zum Einbeziehen von setup.py-Verzeichnisänderungen:
from distutils.core import setup
setup(name='foo',
version='1.0',
packages=['foo'],
package_dir={'foo': 'foo'},
package_data={'foo': ['esri/toolboxes/*.*']},
)
Die neue setup.py-Datei unterscheidet sich durch eine Zeile von der ursprünglichen, wo die zusätzlichen im esri-Verzeichnis gefundenen Daten dem Paket hinzugefügt werden. Wenn nun der Manager für das foo-Modul ausgeführt und installiert wird, wird die folgende Verzeichnisstruktur im Python-Verzeichnis "site-packages" erstellt:

Mithilfe von ArcGIS Desktop und den Python Distribution Utilities (Distutils) kann ein Paket erstellt und installiert werden, das die Geoverarbeitung mit benutzerdefinierten Werkzeugen in benutzerdefinierten Toolboxes erweitert, die über die ArcGIS-System-Toolboxes angezeigt und ausgeführt werden können. Mehr wird für englischsprachige Verteilungen nicht benötigt. Das Thema Internationalisierung baut auf dem Prozess der Geoverarbeitungserweiterung auf, um die gleiche Methode zu nutzen, die Esri zum Packen des Moduls zur Verteilung in anderen Sprachen als Englisch verwendet.