Detailinformationen:
Die Mehrheit der Python-Skriptwerkzeuge, die erfolgreich auf Ihrem Computer ausgeführt werden, können erfolgreich auf einem GIS-Server veröffentlicht und ausgeführt werden – Sie müssen das Skript nicht ändern oder anpassen. Falls jedoch Probleme auftreten, kann es daran liegen, dass das Skript viele Projektdaten verwendet oder Import-Anweisungen einsetzt, um die von Ihnen entwickelten Python-Module zu importieren. In diesem Fall finden Sie dieses Thema wahrscheinlich hilfreich, da es folgende Details erläutert:
- Wie Projektdaten in einem Skript gesucht und auf dem Server zur Task-Ausführung zur Verfügung gestellt werden.
- Wie importierte Module gesucht und auf dem Server zur Task-Ausführung zur Verfügung gestellt werden.
- Wie Projektdaten und Python-Modulparameter in Skripten verarbeitet werden können.
- Wie Werkzeugvalidierungscode verarbeitet wird und welche Interaktionen zwischen Client und Server bestehen.
- Wie Bibliotheken von Drittanbietern gehandhabt werden.
Wenn Sie mit Python, ArcPy oder Skriptwerkzeugen nicht vertraut sind, finden Sie im Abschnitt Erste Schritte mit Python, ArcPy und Skriptwerkzeugen weiter unten eine Liste hilfreicher Themen.
Wie Projektdaten in einem Skript gesucht werden
Wenn Sie ein Ergebnis freigeben, entweder als Paket oder als Service, und das Ergebnis ein Skriptwerkzeug referenziert, wird das Skriptwerkzeug überprüft, um die im Skript verwendeten Projektdaten zu suchen. Werden die Projektdaten gefunden, werden sie in einen temporären Ordner konsolidiert, der entweder gepackt (falls Sie ein Paket freigeben) oder auf den Server hochgeladen wird (falls Sie einen Service freigeben).
Beim Durchsuchen des Skripts wird jede Zeichenfolge in Anführungszeichen (einfache oder doppelte Anführungszeichen) in einer Python-Variable oder als Argument für eine Funktion getestet, um festzustellen, ob es sich um einen Pfad zu vorhandenen Daten handelt. Daten bedeuten in diesem Fall:
- Ein Layer im Inhaltsverzeichnis (ArcMap oder ArcGlobe)
- Ein Ordner
- Eine Datei
- Ein Geodataset wie z. B. Feature-Class, Shapefile, Geodatabase, Kartendokument (.mxd) oder Layer-Datei (.lyr)
Zu Erläuterungszwecken werden nur Daten berücksichtigt, die als Eingabe für Geoverarbeitungswerkzeuge dienen oder als Pfade auf andere Python-Module verweisen. Ausgabedaten werden ebenfalls konsolidiert, aber nicht als Projektdaten betrachtet.
Immer wenn eine Zeichenfolge in Anführungszeichen im Skript gefunden wird, wird der Test auf vorhandene Daten wie folgt fortgeführt:
- Verweist die Zeichenfolge auf einen Layer im Inhaltsverzeichnis?
- Enthält die Zeichenfolge einen absoluten Pfad zu Daten (z. B. "e:\Warehousing\ToolData\SanFrancisco.gdb\streets")?
- Verweist die Zeichenfolge auf Daten, die sich relativ zum Skriptspeicherort befinden? Der Speicherort des Skripts wird wie folgt definiert:
- Der Ordner, der das Skript enthält.
- Wenn das Skript in der Toolbox eingebettet ist, dient der Ordner, der die Toolbox enthält, als Speicherort.
- Wenn sich das Skript in einer Python-Toolbox befindet, dient der Ordner, der die Python-Toolbox enthält, als Speicherort.
Diese Tests werden in sequenzieller Reihenfolge durchgeführt. Wenn die Tests bestanden wurden und die Daten vorhanden sind, werden sie konsolidiert, mit einer Ausnahme: wenn Sie einen Service freigeben, wird der Datenspeicher des Servers überprüft, um festzustellen, ob sich die Daten im Datenspeicher befinden. Falls sie im Datenspeicher vorhanden sind, erfolgt keine Konsolidierung.
Hinweis:
Wenn Ordner konsolidiert werden, werden nur die im Ordner vorhandenen Dateien und Geodatasets kopiert, nicht jedoch die enthaltenen Unterordner. Einige Geodatasets, wie z. B. File-Geodatabases, Raster und TINs sind technisch gesehen Ordner; sie sind jedoch auch Geodatasets und werden daher kopiert. Wenn der Ordner Layer-Dateien (.lyr) oder Kartendokumente (.mxd) enthält, werden alle von der Layer-Datei oder dem Kartendokument referenzierten Daten ebenfalls konsolidiert, sodass die arcpy.mapping-Routinen im Skript Zugriff auf die referenzierten Daten erhalten.
Tipp:
Aufgrund der Art und Weise, wie Ordner konsolidiert werden, sollten Sie die Ordner nicht unnötig mit großen Datasets und Dateien füllen, die nicht vom Werkzeug verwendet werden. Dadurch wird die Datenmenge, die gepackt oder auf den Server hochgeladen werden soll, unnötig vergrößert. (Dies gilt nicht für Ordner, die sich im Datenspeicher des Servers befinden, da diese Ordner nicht auf den Server hochgeladen werden.)
Beispiele
Die unten angegebenen Beispiele basieren auf dieser Ordnerstruktur:
Relative Pfade zu Datasets
Die folgende Technik zum Suchen von Daten relativ zum Speicherort des Skripts ist ein allgemeines Muster, das speziell für Services, die für ArcGIS 10.0 erstellt wurden, gilt. Der Ordner ToolData enthält die File-Geodatabase SanFrancisco.gdb. In SanFrancisco.gdb befindet sich eine Feature-Class namens Streets. In dem Codebeispiel unten wird der Pfad zum Ordner ToolData relativ zum Speicherort des Skripts konstruiert (dasselbe Verzeichnis wie Warehouse.tbx).
import arcpy
import os
import sys
# Get the directory the script lives in.
# Folders and data will be found relative to this location.
#
scriptPath = sys.path[0]
# Construct paths to ../ToolData/SanFrancisco.gdb/Streets and
# ../ToolData/Warehouse.lyr
streetFeatures = os.path.join(scriptPath, "ToolData\\SanFrancisco.gdb\\Streets")
streetLyr = os.path.join(scriptPath, "ToolData\\Warehouse.lyr")
In dem oben angegeben Code werden die Variablen streetFeatures und streetLyr getestet, um zu ermitteln, ob sie vorhandene Daten referenzieren. Diese Datasets werden konsolidiert und auf den Server hochgeladen (es sei denn, der Ordner, in dem sie sich befinden, wurde als Teil des Data Store des Servers referenziert).
Relative Pfade zu Ordnern
Der eigentliche Ordner ToolData kann referenziert und als Startpunkt zum Referenzieren von Elementen verwendet werden. In dem Codebeispiel unten wird der Pfad zum Ordner ToolData und relativ zum Speicherort des Skripts konstruiert (dasselbe Verzeichnis wie Warehouse.tbx).
import arcpy import os import sys
# Get the directory the script lives in. # Folders and data will be found relative to this location. #
scriptPath = sys.path[0]
# Construct paths to the ToolData folder toolDataFolder = os.path.join(scriptPath, "ToolData")
# Construct path to items inside the folder streetFeatures = os.path.join(toolDataFolder, "SanFrancisco.gdb\\Streets")
In dem oben angegeben Code wird die Variable toolDataFolder ein relativer Pfad zu einem Ordner mit verschiedenen Elementen, die im gesamten Python-Skript referenziert werden können. Dieser Ordner ToolData wird konsolidiert. Sein gesamter Inhalt (mit Ausnahme der Unterordner, wie oben erläutert) wird gepackt oder auf den Server hochgeladen (wenn der Ordner ToolData nicht Bestandteil des Serverdatenspeichers ist).
Beachten Sie, dass beim Referenzieren eines Ordners der Inhalt des Ordners, nicht etwa einzelne Dateien kopiert werden. In dem oben angegebenen Code wird die Datei beispielsweise so konsolidiert, wie sie im referenzierten Ordner vorhanden ist, obwohl kein expliziter Pfad zu Warehouse.lyr erstellt wurde.
Absoluter Pfad zum Geodataset
Ein absoluter Pfad beginnt mit einem Laufwerksbuchstaben, beispielsweise e:/, wie im Codebeispiel unten gezeigt. import arcpy import os
streetFeatures = 'e:/Warehousing/ToolData/SanFrancisco.gdb/Streets'
In dem oben angegebenen Code wird das Dataset Streets und alle anderen Daten, von denen es abhängt (wie Beziehungsklassen und Domänen), konsolidiert.
Hybrid-Beispiel
import arcpy import os
toolDataPath = r'e:\Warehousing\ToolData' warehouseLyr = os.path.join(toolDataPath, "Warehouse.lyr")
In dem oben angegebenen Code wird der gesamte Inhalt des Ordners ToolData konsolidiert. Da der Ordnerinhalt (ohne Unterordner) konsolidiert wird, werden Warehouse.lyr und die von Warehouse.lyr referenzierten Daten ebenfalls konsolidiert.
Referenzieren von Layern als Projektdaten
Ein nicht so gängiger Workflow zum Verwenden von Layern als Projektdaten könnte die Performance des Python-Skriptwerkzeugs erheblich verbessern. Die oben genannten Python-Snippets verwenden vollständige Pfade zu Feature-Classes und Layer-Dateien. Wenn ein Geoverarbeitungsservice ausgeführt wird, muss er zuerst das Dataset öffnen, was zu Performance-Einbußen führt. Durch die Verwendung von Layern im Skript bleiben die Daten geöffnet und werden für eine schnellere Ausführung gecacht. Die folgende Abbildung veranschaulicht, wie Layer im Inhaltsverzeichnis von ArcMap abgeglichen und im Python-Skript verwendet werden.
Die beiden Layer aus dem Inhaltsverzeichnis werden im Skriptwerkzeug verwendet. Die Variablen zeigen auf einfache Zeichenfolgen, die mit den Layer-Namen im Kartendokument übereinstimmen. Beim Veröffentlichen dieses Workflows in ArcGIS-Server werden die Daten konsolidiert und auf den Server verschoben (wenn sie nicht im Data Store referenziert sind) und im Service wird ein Verweis auf die im Speicher befindlichen Layer gespeichert. In diesem Service sucht und verwendet das Werkzeug Layer über diese Namensübereinstimmung.
Hinweis:
Wenn Layer als interne Projektdaten für ein Skriptwerkzeug verwendet werden, wird das Skriptwerkzeug vom verknüpften Kartendokument abhängig. Wenn diese Layer nicht vorhanden sind, kann das Werkzeug weder in ArcCatalog noch über ein anderes Kartendokument ausgeführt werden. Dieses Muster kann nicht mit der Hintergrundverarbeitung verwendet werden und reduziert die allgemeine Portabilität des Workflows. Daher ist dieses Muster vor allem für die Erstellung von Geoverarbeitungsservices geeignet.
Schrägstriche und umgekehrte Schrägstriche
Unter Windows wird ein umgekehrter Schrägstrich (\) als Trennzeichen in Pfaden verwendet. In UNIX-Systemen wird hingegen ein Schrägstrich (/) verwendet.
Hinweis:
In ArcGIS ist es egal, ob Sie einen Schrägstrich oder einen umgekehrten Schrägstrich in Ihrem Pfad verwenden. ArcGIS konvertiert diese immer in die entsprechende Betriebssystemkonvention.
Umgekehrter Schrägstrich bei Skripten
Programmiersprachen, deren Wurzeln in den Programmiersprachen UNIX und C liegen, z. B. Python, behandeln den umgekehrten Schrägstrich (\) als Escape-Zeichen. Beispielsweise stellt \t einen Tabulator dar. Da Pfade umgekehrte Schrägstriche enthalten können, müssen Sie verhindern, dass umgekehrte Schrägstriche als Escape-Zeichen interpretiert werden. Die einfachste Möglichkeit hierzu ist das Konvertieren von Pfaden in Python-Raw-Strings mit der Direktive r, wie unten dargestellt. Hiermit wird Python angewiesen, umgekehrte Schrägstriche zu ignorieren.
thePath = r"E:\data\telluride\newdata.gdb\slopes"
Importieren anderer Python-Module
Ihr Skript kann andere Skripte importieren, die Sie bereitgestellt haben. Der Code unten stellt beispielsweise den Import eines Python-Moduls namens myutils.py dar, das sich im selben Verzeichnis wie das Parent-Skript befindet und eine Routine namens getFIDName enthält.import arcpy
import myutils
inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)
Immer wenn die Anweisung import vorkommt, wird das Skript in der folgenden Reihenfolge gesucht:
- Im selben Ordner wie das Skript. Wenn das Skript in der Toolbox eingebettet ist, wird der Ordner, der die Toolbox enthält, verwendet.
- Der von der Systemvariable PYTHONPATH referenzierte Ordner.
- Ein beliebiger Ordner, der von der Systemvariable PATH referenziert wird.
Eine weitere Vorgehensweise zum Referenzieren von zu importierenden Modulen ist die Verwendung der Methode sys.path.append. Damit können Sie einen Pfad zu einem Ordner einrichten, der die zu importierenden Skripte enthält.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
Beachten Sie im oben angegebenen Code, dass die Methode sys.path.append einen Ordner als Argument erfordert. Da r'e:\Warehousing\Scripts' ein Ordner ist, wird der gesamte Inhalt des Ordners konsolidiert. Die Regeln zum Kopieren des Ordnerinhalts gelten hier ebenfalls – alles im Ordner wird kopiert, außer Unterordner, die keine Geodatasets sind.
Hinweis:
Python-Skripte im Ordner werden nicht auf Projektdaten oder importierte Module überprüft.
Werkzeugvalidierungscode
Wenn Sie Erfahrungen mit dem Schreiben von Skriptwerkzeugen haben, können Sie eine eigene Logik zur Werkzeugvalidierung bereitstellen. Clients des Geoverarbeitungsservice haben nicht die Möglichkeit zur Ausführung Ihrer Werkzeugvalidierungslogik – nur der Server kann dies. Wenn der Client seine Task-Ausführungsanforderung an den Service sendet, wird die Validierungslogik auf dem Server ausgeführt. Falls die Validierungsroutine einen Fehler ergibt, wird die Task-Ausführung gestoppt. Sie können den Service Meldungen zurückgeben lassen, sodass dem Client Meldungen von den Validierungsroutinen angezeigt werden.
Validierungslogik wird mit Python implementiert, und der Validierungscode wird wie jedes andere Python-Skript auf Projektdaten und Module überprüft. So kann die Validierungslogik beispielsweise einen Ordner öffnen (z. B. d:\approved_projections), der Projektionsdateien enthält (.prj), um eine Auswahlliste von Raumbezügen zu erstellen, die der Client bei der Ausführung des Werkzeugs verwenden kann. Dieser Ordner ist kein Werkzeugparameter; es handelt sich um Projektdaten, die im Werkzeugvalidierungsskript verwendet werden. Die oben beschriebene Regel gilt auch für Python-Skripte, und folglich wird der Ordner d:\approved_projections konsolidiert und auf den Server kopiert (falls er sich nicht bereits im Datenspeicher des Servers befindet).
Umwandeln von Projektdaten und Modulen in Werkzeugparameter
Wie oben beschrieben werden Python-Skripte bei der Freigabe überprüft und dann anhand der im Code gefundenen, in Anführungszeichen gesetzten Zeichenfolgen entschieden, welche Daten das Skript verwendet. Wenn Sie diesen Prozess steuern möchten, können Sie Parameter für alle vom Skript verwendeten Daten und Module erstellen. Das Skriptbeispiel unten verdeutlicht dies – alle Projektdaten und Module wurden hier in Parameter umgewandelt, die an das Skript übergeben werden.
import arcpy import sys import os
inFeatures = arcpy.GetParameterAsText(0) # Feature Layer projectDataFolder = arcpy.GetParameterAsText(1) # Folder myPythonModules = arcpy.GetParameterAsText(2) # Folder
# Append the path to the utility modules to the system path
# for the duration of this script. #
sys.path.append(myPythonModules) import myutils # a Python file within myPythonModules
# Construct a variable to hold the Streets feature class found in the
# project data folder
#
streetsFeatures = os.path.join(projectDataFolder, "SanFrancisco.gdb", "Streets")
Wenn das Skript wie oben gezeigt Parameter für alle seine Daten verwendet, hat dies mehrere Vorteile:
- Sie haben einen besseren Überblick, welche Daten das Skript benötigt – da es sich um Parameter handelt, können Sie sie im Werkzeugdialogfeld sehen. Sie müssen nicht den Code bearbeiten, um zu bestimmen, welche Daten Sie verwenden.
- Die interne Werkzeugvalidierungslogik wird angewendet – wenn der Parameterwert auf Daten verweist, die nicht vorhanden sind, zeigt das Werkzeugdialogfeld einen Fehler an und kann das Werkzeug nicht zur Erstellung eines Ergebnisses ausführen.
- Um den Speicherort der Daten zurückzusetzen, können Sie im Werkzeugdialogfeld nach dem Speicherort suchen, statt den Speicherort in das Skript einzugeben (was fehleranfällig ist).
- Sobald das Ergebnis als Service freigegeben wird, legt der Service-Editor die Ordner-Parameter auf den Eingabemodus Konstant fest; der Client sieht die Parameter nicht. Beim Veröffentlichen werden die beiden Ordner auf den Server kopiert (falls sie nicht schon im Datenspeicher registriert sind). Wenn der Task auf dem Server ausgeführt wird, empfängt das Skript die Pfade zu den kopierten Ordnern.
Module von Drittanbietern
Drittanbietermodule (alle Module, die nicht Teil der Python-Kerninstallation sind) werden nicht konsolidiert. Sie müssen sicherstellen, dass das Modul vorhanden ist und ordnungsgemäß auf dem Server ausgeführt wird. Dies gilt nicht für die Module numpy und matplotlib, die mit ArcGIS for Server installiert werden.
Hinweis:
Python-Module von Drittanbietern (außer numpy und matplotlib) auf Linux-Plattformen müssen gesondert gehandhabt werden.
Weitere Informationen zum Installieren von Python-Modulen von Drittanbietern unter Linux
Erste Schritte mit Python, ArcPy und Skriptwerkzeugen
Wenn Sie mit Python, ArcPy und Skriptwerkzeugen noch nicht vertraut sind, finden Sie in der Tabelle unten einige Themen, die Ihnen bei den ersten Schritten helfen.
Hilfethema | Inhalt |
---|---|
Kurzer Überblick über das Erstellen von benutzerdefinierten Werkzeugen | Grundlegende Konzepte beim Erstellen eigener Geoverarbeitungswerkzeuge |
Einführung in Python und ArcPy. Von diesen Themen gelangen Sie zu ausführlicheren Themen über Python und das ArcPy-Site-Paket. | |
Kurzer Überblick über das Erstellen von Werkzeugen in Python | Einführung in das Erstellen von benutzerdefinierten Skriptwerkzeugen mit Python. |
Nachdem Sie sich mit dem Erstellen von Skriptwerkzeugen vertraut gemacht haben, wird häufig auf dieses Thema verwiesen, da es ausführlich erläutert, wie Sie Skriptwerkzeug-Parameter definieren. |