Script Python con terminazione automatica in ArcMap?


17

Ho provato sys.exit, ma non sembra funzionare in ArcMap 10.

qualcuno sa come farlo?

Risposte:


16

Dagli esempi di ArcPy , sembra che sys.exit()sia il modo corretto di terminare uno script in anticipo.

La documentazione di Python osserva che sys.exit():

viene implementato sollevando l'eccezione SystemExit, pertanto vengono rispettate le azioni di pulizia specificate dalle clausole infine delle istruzioni try ed è possibile intercettare il tentativo di uscita a un livello esterno.

Il modo più semplice per gestirlo è avvolgere lo script in un gestore di eccezioni:

import sys
import arcpy

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

Tuttavia, questo non è particolarmente elegante e richiede una ristrutturazione dell'intero progetto, per non parlare di un altro livello di rientro. Inoltre, nell'improbabile situazione in cui un'altra parte del tuo codice solleva SystemExitun'eccezione che non avresti mai saputo a riguardo ... Un'altra soluzione inelegante ma forse preferibile è quella di avvolgere le chiamate a sys.exit () in un'altra funzione:

import sys
import arcpy

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

#do stuff
finish()

Ora puoi chiamare finish(), finish(1)o finish('Error message')proprio come ti aspetti di poter chiamare sys.exit ().

Ovviamente, potremmo voler usare il nostro approccio al consumo di eccezioni in altre circostanze, e poiché questo è Python, possiamo generalizzare e creare un utile decoratore multiuso:

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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.