Fehler im Code sind unvermeidlich, und es gibt zwei grundlegende Möglichkeiten, Stellen mit Fehlern zu ermitteln:
- Fügen Sie dem Code eine geeignete print-Anweisung hinzu, die Sie beim Eingrenzen des Problems unterstützt.
- Verwenden Sie einen interaktiven Debugger.
Verwenden von print-Anweisungen
Die Verwendung von print-Anweisungen zum Ermitteln von Fehlern ist eine naheliegende und gängige Methode. Da Skriptwerkzeuge Zugriff auf das Fortschrittsdialogfeld des Werkzeugs haben, können Sie das Skript so anpassen, dass es Aufrufe von AddMessage(), AddWarning() oder AddError() enthält. Werte und Prüfpunktmeldungen werden dann im Fortschrittsdialogfeld ausgegeben. Ein anderer Ansatz ist die Verwendung einer unabhängigen Methode wie das Zurückgeben von Meldungen, z. B. die MessageBox-Methode des win32ui-Moduls. Diese Methode zeigt ein Popup-Dialogfeld an. Da Sie im Dialogfeld auf OK klicken müssen, um die Ausführung fortzusetzen, können Sie mit dieser Methode das Tempo bei der Ausführung des Skripts bestimmen. Dies ist ein Beispiel für die Verwendung der beiden Methoden:
import arcpy
import win32ui
import win32con
n = 5
# Print message to progress dialog
#
arcpy.AddMessage("Value of n = {}".format(n))
# Issue a popup dialog with OK and Cancel button
#
val = win32ui.MessageBox("Value of n = {}".format(n), "title",
win32con.MB_OKCANCEL)
# Based on the button clicked, you can branch execution
#
if val == 1:
arcpy.AddMessage("You clicked OK")
else:
arcpy.AddError("You clicked Cancel")
raise arcpy.ExecuteError, "Execution stops due to Cancel button click"
arcpy.AddMessage("This statement reached")
Verwenden von Debuggern
Die andere Methode umfasst das Verwenden einer integrierten Python-Entwicklungsumgebung (IDE), die das Debuggen unterstützt. Mit Debuggern können Sie Haltepunkte festlegen, auf einzelne Codezeilen zugreifen, aus diesen herausspringen oder diese überspringen und den Inhalt von Variablen untersuchen, ohne dafür den Code ändern zu müssen. Im Vergleich zum Einfügen von print-Anweisungen sind Debugger viel effizienter und ermöglichen in der Regel das Isolieren eines Fehlers.
Beispiele für gängige IDEs sind:
- Python-IDE, die mit Python installiert wird
- PythonWin, online verfügbar unter https://sourceforge.net/projects/pywin32
- PyScripter, online verfügbar unter http://code.google.com/p/pyscripter
- Kommerzielle Systeme, z. B. Wing IDE (http://wingware.com)
Eine Möglichkeit der Verwendung eines Debuggers ist das direkte Öffnen des Skripts in der IDE. Das Skript wird dann bearbeitet, damit alle Parameter über Werte verfügen, bevor das Debuggen gestartet wird. In einfachen Fällen ist dies meist ausreichend. Wenn das Skript jedoch Layer- oder Tabellensichtparameter verwendet, müssen diese Variablen "on-the-fly" erstellt werden. Komplexe Parameter, wie eine Feldzuordnung oder ein Raumbezug, sind nur schwer in Form von Variablen zu erstellen.
Im Idealfall möchten Sie als Benutzer in der Lage sein, das Dialogfeld für das Skriptwerkzeug zu öffnen, Parameter einzugeben und eine IDE mit dem Code zu starten, der für das Debuggen bereit ist. Dies erreichen Sie durch einige einfache Änderungen, die unten beschrieben sind.
Verwenden von GetParameterAsText()
Der erste Schritt umfasst das Ändern des Skripts, sodass es GetParameterAsText() anstelle von sys.argv[] verwendet, wie unter Parameter der Skriptwerkzeuge beschrieben. Dies ist eine Änderung, die Sie beibehalten können. Es ist nicht erforderlich, den Code wieder auf die Verwendung von sys.argv[] zurückzusetzen.
Ausführen und Debuggen des Werkzeugs
- Legen Sie unter Geoverarbeitung > Geoverarbeitungsoptionen die Option Debugger (z. B. PythonWin) fest.
- Klicken Sie im Fenster Katalog mit der rechten Maustaste auf das Werkzeug, und wählen Sie Debuggen.
- Öffnen Sie in der Toolbox das Skriptwerkzeug, geben Sie alle Parameter ein, die Sie festlegen möchten, und klicken Sie dann auf OK. Es kann einige Zeit dauern, bis die IDE geöffnet wird. Der Skriptcode wird angezeigt, und Sie können mit der Debug-Anwendung normal interagieren.
Sie können einen Haltepunkt festlegen und das Skript bis zum Haltepunkt ausführen und alle anderen für den Debugger zulässigen Optionen verwenden. Parameterwerte, die Sie im Dialogfeld eingegeben haben, werden von GetParameterAsText() erfasst.
Beim Ausführen des Skripts werden alle Interaktionen ausgeführt, die normalerweise zwischen dem Skript und der Anwendung erfolgen. Wenn Sie also Funktionen wie AddMessage(), AddWarning() oder AddError() verwenden, werden diese Meldungen in der Anwendung angezeigt. Falls Sie Verlaufsanzeigefunktionen verwenden, wird die Verlaufsanzeige im Werkzeugdialogfeld aktualisiert, während Sie das Skript durchlaufen. Nachdem das Skript beendet wurde, können Sie zur Anwendung zurückkehren, indem Sie den Debugger schließen. Falls Sie planen, das Skriptwerkzeug ein zweites Mal zu debuggen, können Sie den Debugger geöffnet lassen und im Fortschrittsdialogfeld des Werkzeugs auf Abbrechen klicken.