Selbstbeendigendes Python-Skript in ArcMap?

17

Ich habe es versucht sys.exit, aber es scheint in ArcMap 10 nicht zu funktionieren.

Weiß jemand, wie es geht?

Gerber
quelle

Antworten:

16

In ArcPy-Beispielen scheint sys.exit()es der richtige Weg zu sein, ein Skript vorzeitig zu beenden.

In der Python-Dokumentation wird Folgendes angegeben sys.exit():

wird durch Auslösen der SystemExit-Ausnahme implementiert, sodass die in finally-Klauseln von try-Anweisungen angegebenen Bereinigungsaktionen berücksichtigt werden und der Beendigungsversuch auf einer äußeren Ebene abgefangen werden kann.

Die einfache Möglichkeit, dies zu bewältigen, besteht darin, Ihr Skript in einen Ausnahmehandler einzubinden:

import sys
import arcpy

try:
    #do stuff
    sys.exit(0)
except SystemExit:
    pass

Dies ist jedoch nicht besonders elegant und erfordert eine Umstrukturierung Ihres gesamten Projekts sowie eine weitere Einrückungsebene. In dem unwahrscheinlichen Fall, dass ein anderer Teil Ihres Codes eine SystemExitAusnahme auslöst, würden Sie nie darüber Bescheid wissen.

import sys
import arcpy

def finish(arg=None):
    try:
        sys.exit(arg)
    except SystemExit:
        pass

#do stuff
finish()

Jetzt können Sie anrufen finish(), finish(1)oder finish('Error message')wie Sie erwarten zu können , sys.exit () aufzurufen.

Natürlich möchten wir unseren Essansatz für Ausnahmen unter anderen Umständen verwenden, und da dies Python ist, können wir einen nützlichen Mehrzweckdekorateur verallgemeinern und erstellen:

import sys
import arcpy

def eat_exception(fn, exception):
    def safe(*v, **k):
        try:
            fn(*v, **k)
        except exception:
            pass
    return safe

finish = eat_exception(sys.exit, SystemExit)

#do stuff
finish()
fmark
quelle