Ich habe ein ArcPy-Tool-Skript für ArcGIS 10.0, das zwei Hauptfunktionsabschnitte enthält. Der Benutzer kann wählen, ob der zweite Abschnitt ausgeführt werden soll oder nicht. Wenn der Benutzer den zweiten Abschnitt NICHT ausführt, möchte ich einfach eine Bereinigungsfunktion ausführen und das Skript mit einem sys.exit (0) beenden, ohne dass eine Fehlermeldung im Fenster mit den Werkzeugergebnissen angezeigt wird. In GIS-SE gibt es zwei wichtige Threads zum Beenden von Arcpy-Skripten, die darin enthaltenen Lösungen behandeln die Fehlermeldung jedoch nicht speziell. Die allgemeine Struktur des Codes lautet wie folgt:
import sys
##import arcpy
def CleanUp():
print 'Cleaning up ...\n'
def finish():
CleanUp()
print 'Exiting ...'
sys.exit(0)
do_more = False #or True ... input from user
#Section 1: do some stuff
print 'Doing some stuff ...\n'
if not do_more:
finish()
#Section 2: do more stuff
print 'doing more stuff ...'
CleanUp()
Wenn ich diesen Code im Python-Interpreter außerhalb von ArcGIS / arcpy ausführe, funktioniert er wie erwartet und wird ordnungsgemäß ohne Fehlermeldung beendet. In meinem Arcpy-Skript mit der gleichen Struktur wird das Skript jedoch beendet, es wird jedoch eine SystemExit-Fehlermeldung im Tool-Ergebnisfenster angezeigt. Gibt es eine Möglichkeit, das Skript des arcpy-Tools zu veranlassen, die Ausnahme aufzuheben und die SystemExit-Fehlermeldung zu begraben?
quelle
Antworten:
Kurze Antwort: behoben in 10.1. Im Moment müssen Sie eine zusätzliche Einrückungsstufe hinzufügen. Dies kann jedoch zu nützlichen Änderungen an Ihrem Code führen. Jedes Mal, wenn Sie eine große Anzahl von Zeilen in einem einzelnen Skript / einer einzelnen Routine erhalten, sollten Sie darüber nachdenken, diese in kleinere Abschnitte (Funktionen, Klassen) zu unterteilen.
quelle
ArcPy beeinträchtigt Ihre Python-Umgebung . Kurz gesagt, führen Sie entweder sys.exit () nicht aus oder suchen / rufen Sie die Funktion "Aufräumen vor dem Beenden" (falls vorhanden) von arcpy nicht auf, bevor Sie sys.exit () aufrufen.
quelle
sys.exit()
ist eine Art schmutziger Trick - der Aufrufexit
löst eineSystemExit
Ausnahme aus, und der Interpreter der obersten Ebene, der normalerweise einen Traceback ausgibt, erkennt den Ausnahmetyp und beendet den Interpreter. Das Einbetten eines Python-Interpreters in eine andere Anwendung, z. B. die ArcGIS-Familie von ausführbaren Dateien, erfordert eine nicht unerhebliche Menge an implementierungsspezifischem Code wie diesen.Ich weiß nicht, wie ich die SystemExit-Fehlermeldung "begraben" kann, aber Sie können Ihren Code immer neu strukturieren, um den Aufruf von sys.exit zu vermeiden
quelle