Packen von Python-Skripten

Detailinformationen:

Die Mehrheit der Python-Skriptwerkzeuge, die erfolgreich auf Ihrem Computer ausgeführt werden, können gepackt und nach dem Entpacken auf einem anderen Computer erfolgreich ausgeführt werden. Sie müssen das Skript nicht ändern oder anpassen. Falls jedoch Probleme auftreten, kann dies daran liegen, dass das Skript hartcodierte Datenpfade oder import-Anweisungen einsetzt, um die von Ihnen entwickelten Python-Module zu importieren. In diesem Fall kann dieses Thema hilfreich sein, da es folgende Details erläutert.

  1. Wie Daten mit hartcodierten Pfaden in einem Skript gesucht und in ein Paket aufgenommen werden.
  2. Wie importierte Module gesucht und in ein Paket aufgenommen werden.
  3. Wie Werkzeugvalidierungscode gepackt wird.
  4. Wie Bibliotheken von Drittanbietern gepackt werden.

Wie Daten 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 Daten zu suchen. Wenn ein Datenpfad gefunden wird, wird er in einen temporären Ordner konsolidiert, der in das Paket eingefügt wird.

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 Karten-Layer
  • Ein Ordner
  • Eine Datei
  • Ein Geodataset wie beispielsweise eine Feature-Class, ein Shapefile, eine Geodatabase oder eine Layer-Datei.

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.

Immer wenn eine Zeichenfolge in Anführungszeichen im Skript gefunden wird, wird der Test auf vorhandene Daten wie folgt fortgeführt:

  1. Bezieht sich die Zeichenfolge auf einen Karten-Layer?
  2. Enthält die Zeichenfolge einen absoluten Pfad zu Daten, z. B. e:\Warehousing\ToolData\SanFrancisco.gdb\streets?
  3. 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.

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 enthält, werden alle von der Layer-Datei oder dem Kartendokument referenzierten Daten ebenfalls konsolidiert, sodass die arcpy.mp-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 werden soll, unnötig vergrößert.

Beispiele

Die unten angegebenen Beispiele basieren auf dieser Ordnerstruktur:

Beispiel-Projektordner
Beispiel-Projektordner

Relative Pfade und Ordner

Die folgende Technik zum Suchen von Daten relativ zum Speicherort des Skripts ist ein allgemeines Muster. Der folgende Skriptcode befindet sich zu Referenzzwecken im oben abgebildeten Ordner Scripts. Der Ordner ToolData enthält SanFrancisco.gdb. In SanFrancisco.gdb ist eine Feature-Class namens Streets enthalten. In dem Codebeispiel unten wird der Pfad zum Ordner ToolData relativ zum Speicherort des Skripts konstruiert (der Ordner 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")

In dem oben angegeben Code wird die Zeichenfolge "ToolData" (ein Argument der Funktion os.path.join) getestet, um festzustellen, ob sie Daten enthält. In diesem Fall gibt es einen Ordner namens ToolData relativ zum Speicherort des Skripts. Dieser ToolData-Ordner wird konsolidiert; sein gesamter Inhalt (mit Ausnahme der oben genannten Unterordner) wird gepackt.

Beachten Sie, dass Ordnerinhalte kopiert werden, keine individuellen Dateien. Im oben genannten Code ist der Pfad zu dem Dataset e:/Warehousing/ToolData/SanFrancisco.gdb/Streets konstruiert. Während der Konsolidierung wird dies nicht isoliert und nur das Dataset Streets kopiert, sondern der gesamte Ordner ToolData wird kopiert.

Absoluter Pfad zum Geodataset

Ein absoluter Pfad beginnt mit einem Laufwerksbuchstaben, beispielsweise e:/, wie im Codebeispiel unten gezeigt.

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

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

In dem oben angegebenen Code wird der gesamte Inhalt des Ordners ToolData konsolidiert. Da der Ordnerinhalt (ohne Unterordner) konsolidiert wird, werden Warehouse.lyrx und die von Warehouse.lyrx referenzierten Daten ebenfalls konsolidiert.

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 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.
Wenn sich das zu importierende Skript in einem dieser Ordner befindet, wird das Skript konsolidiert. Der Suchvorgang erfolgt rekursiv – das importierte Skript wird ebenfalls auf Projektdaten überprüft, und diese werden anhand der oben beschriebenen Regeln importiert.

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 'e:\Warehousing\Scripts' ein Ordner ist, wird der gesamte Ordnerinhalt 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. 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 Benutzer bei der Ausführung Ihres Werkzeugs auswählen können. Dieser Ordner ist kein Werkzeugparameter; es handelt sich lediglich um einen Datenpfad, der im Werkzeugvalidierungsskript verwendet wird. Die oben beschriebene Regel gilt auch für Python-Skripte, und folglich wird der Ordner d:\approved_projections konsolidiert und in das Paket aufgenommen.

Bibliotheken von Drittanbietern

Drittanbietermodule (alle Module, die nicht Teil der Python-Kerninstallation sind) werden nicht konsolidiert. Stellen Sie sicher, dass das Modul auf dem Computer installiert wird, auf dem das Paket entpackt wird. Sie sollten Dokumentation für Ihr Werkzeug und Paket bereitstellen, in der angegeben ist, welche Drittanbietermodule erforderlich sind. Dies gilt nicht für die Drittanbietermodule numpy, matplotlib und pandas usw., die mit ArcGIS installiert werden.