Script Python à terminaison automatique dans ArcMap?

17

J'ai essayé sys.exit, mais cela ne semble pas fonctionner dans ArcMap 10.

Quelqu'un sait comment le faire?

Tanneur
la source

Réponses:

16

À partir d'exemples ArcPy , il semble que ce sys.exit()soit la bonne façon de terminer un script plus tôt.

La documentation Python note que sys.exit():

est implémenté en levant l'exception SystemExit, donc les actions de nettoyage spécifiées par les clauses finally des instructions try sont honorées, et il est possible d'intercepter la tentative de sortie à un niveau externe.

Le moyen le plus simple de résoudre ce problème consiste à encapsuler votre script dans un gestionnaire d'exceptions:

import sys
import arcpy

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

Cependant, cela n'est pas particulièrement élégant et nécessite une restructuration de l'ensemble de votre projet, sans parler d'un autre niveau d'indentation. De plus, dans le cas peu probable où une autre partie de votre code déclenche une SystemExitexception que vous ne sauriez jamais à ce sujet ... Une autre solution inélégante mais peut-être préférable consiste à encapsuler les appels à sys.exit () dans une autre fonction:

import sys
import arcpy

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

#do stuff
finish()

Maintenant , vous pouvez appeler finish(), finish(1)ou finish('Error message')tout comme vous vous attendez à pouvoir appeler sys.exit ().

Bien sûr, nous pourrions vouloir utiliser notre approche de l'alimentation d'exception dans d'autres circonstances, et comme il s'agit de Python, nous pouvons généraliser et créer un décorateur utile et polyvalent:

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
la source