Debuggen von ArcPy-Skripten?

50

Ich habe in ArcGIS 10 viele Python-Skripten mit ArcPy geschrieben. Bislang kann ich nur Nachrichten im Fenster mit den Geoverarbeitungsergebnissen drucken arcpy.AddMessage().

Gibt es noch andere Möglichkeiten, wie zum Beispiel das Setzen von Haltepunkten?

Jasons Methode funktioniert großartig. Wenn Sie einen Fehler in Ihrer Toolbox haben, z. B. eine Überprüfung, kann Ihre IDE das Problem möglicherweise nicht ermitteln, da die Toolboxen codiert sind. Zumindest konnte WING es nicht genau bestimmen.

Gerber
quelle
Vielleicht eine Option hier? Code Google Pyscripter
Brad Nesom
In der ArcGIS-Hilfe wird die Verwendung des Debuggers in PythonWin
Regan Sarwas am
Haben Sie in den Dateieigenschaften des Betriebssystems versucht, das Standardprogramm für .py-Dateien auf PyScripter festzulegen?
KiloGeo
Würde ich auf diese Weise dem Betriebssystem nicht effektiv mitteilen, dass ich mein Python-Skript nicht ausführen, sondern nur im Editor öffnen möchte?
RyanDalton
Ja richtig. Tut mir leid, dass ich Ihren Zweck missverstanden habe.
KiloGeo

Antworten:

37

In der Regel gehen Python-Debugger / -IDEs davon aus, dass das Python-Skript im selben Prozess ausgeführt wird wie es selbst. Das Debuggen eines in ArcMap.exe ausgeführten Skripts ist also ein Kinderspiel debuggen mit.

Eine Methode, die in den letzten Jahren für mich sehr gut funktioniert hat, besteht darin, ein einfaches Skript zu schreiben, das nur das Tool aufruft und dieses als Hauptskript in der Python-IDE (Wing oder Pythonwin) verwendet und meine Haltepunkte in der .py-Datei des Tools festgelegt hat Die Datei wird auch in derselben IDE-Sitzung geöffnet.

Im Grunde mache ich das:

  1. Rufen Sie die Eingaben ab, die in meinem Skript-Tool nicht funktionieren
  2. Öffnen Sie eine einfache .py-Datei in demselben Ordner wie die .tbx, die das Tool aufruft
  3. Öffnen Sie das Aufruferskript und die PY-Datei des Skripttools in der IDE
  4. Legen Sie Haltepunkte in der Skript-Tool-Datei fest
  5. Führen Sie das Anruferskript aus

Und mein Anruferskript ist normalerweise ziemlich einfach:

import os
import arcpy
arcpy.ImportToolbox(os.path.join(os.path.dirname(__file__), 'my.tbx'))
arcpy.MyToolThatIsFailing_myalias("inputs", "that", "don't" "work")

Ich habe versucht, mit winpdb Skripte zu debuggen, die in ArcMap ausgeführt werden, aber ich hatte noch nie Glück. Wenn Sie es ausprobieren möchten und es funktioniert, teilen Sie uns bitte Ihre Ergebnisse mit.

Jason Scheirer
quelle
1
schöne lösung! Ich werde es versuchen.
George Silva
Ich habe winpdb in der Vergangenheit erfolgreich zum Debuggen von Skripten mit langem Prozess verwendet. Mit winpdb können Sie nach dem Einrichten in ein aktuell ausgeführtes eigenständiges Skript oder theoretisch in ein anderes Skript wie ArcMap "springen" und es normal debuggen. Dies war sehr praktisch, um ein Skript einzuchecken, dessen Fertigstellung Wochen in Anspruch nehmen würde. Ich habe jedoch nicht versucht, arcpy innerhalb eines ArcGIS-Anwendungsprozesses zu debuggen.
blah238
Ich würde PyCharm empfehlen. es funktioniert wie Magie
user39901230
26

Sie können es im Dialogfeld GP-Optionen ändern. Zeigen Sie einfach auf die ausführbare Datei Ihrer Wahl für den Editor / Debugger.

GP-Einstellungsdialog

Jason Scheirer
quelle
Dies scheint eine neue Erweiterung für ArcGIS 10 zu sein, richtig? Ich sehe diese Einstellungsoption für 9.3 nicht.
RyanDalton
Richtig, neu in 10.
Jason Scheirer
9

Für Benutzer von 10 Jahren ist es eindeutig am besten, Jasons Beitrag als "beste Antwort" zu markieren. Für Benutzer von 9.3 war ich in der Lage, die Anweisungen des ESRI KB-Supports zu befolgen, die in Brads Beitrag verlinkt sind, damit es funktioniert.

Letztendlich bestand der Schlüssel zur Standardbearbeitung von ArcGIS-Python-Skripten in Pyscripter darin, die Systemaktion für "registrierte Dateitypen" zu bearbeiten, die mit * .py-Dateien enden (Schritt 4). Ich habe einen neuen Aktionstyp "Bearbeiten" erstellt und dann den Pfad "Pyscripter.exe" eingefügt. Sobald ich dies getan habe, war die Standardbearbeitungsaktion eingerichtet, um Pyscripter anstelle von IDLE zu starten.

Die Zeichenfolge, die ich verwendet habe (weil sie im unten gezeigten Dialogfeld abgeschnitten wurde), lautet:

"C:\Program Files\PyScripter\PyScripter.exe" "%1"

Bildbeschreibung hier eingeben

RyanDalton
quelle
1
+1 für die Antwort und noch einmal, wenn ich könnte, für das Einfügen des Strings und nicht nur eines Bildes (Text ist so viel einfacher zu kopieren und einzufügen!).
Matt Wilkie
7

Ich weiß nicht, wie das mit arcpy funktioniert, aber Sie können pdb ausprobieren :

import pdb; pdb.set_trace()
nw1
quelle
Es gibt eine ähnliche Funktionalität für pydev mit Eclipse, die hier beschrieben wird. Sie legen fest, dass Eclipse auf ein Signal wartet, und Sie können dies in Code auslösen, der vollständig außerhalb von Eclipse ausgeführt wird, indem Sie den Funktionsaufruf pydevd.settrace () ausführen. urbansim.org/Documentation/DebuggingWithEclipse
ako
0

Der einfachste Weg, meinen Code zu debuggen, besteht darin, meine Eingaben in den Dateipfad eines vorhandenen Datasets fest zu codieren. Zum Beispiel:

import arcpy

# parameters for script
#input1 = arcpy.GetParameterAsText(0) # layer
#input2 = arcpy.GetParameterAsText(1) # folder

# debugging parameters
input1 = r"path/to/your/data.shp"
input2 = r"path/to/your/folder"

Zusätzlich zum Ergebnisfenster werden im Python-Fenster hilfreiche Fehlermeldungen angezeigt und / oder Sie können Codeausschnitte testen.

Jede gute IDE verfügt über einen Debug-Test, der Ihre gesamte Verarbeitung bis zum aktuellen Haltepunkt im Speicher hat. Damit können Sie sehen, was mit den Daten los ist. Legen Sie Haltepunkte fest, an denen Sie das Skript anhalten möchten. Verwenden Sie bedingte Haltepunkte, wenn Sie eine Schleife bei einer bestimmten Iteration anhalten möchten. Informieren Sie sich auch über Ihre Arc-Versionen und welche Funktionen für diese Versionen verfügbar sind.

gisdude
quelle