Samo kończący się skrypt Pythona w ArcMap?

17

Próbowałem sys.exit, ale wydaje się, że nie działa w ArcMap 10.

Czy ktoś wie jak to zrobić?

Garbarz
źródło

Odpowiedzi:

16

Z przykładów ArcPy wydaje się, że sys.exit()jest to właściwy sposób na wcześniejsze zakończenie skryptu.

Dokumentacja Pythona zauważa, że sys.exit():

jest implementowany przez zgłoszenie wyjątku SystemExit, więc działania czyszczące określone w klauzulach instrukcji try są wreszcie honorowane i możliwe jest przechwycenie próby wyjścia na poziomie zewnętrznym.

Najłatwiejszym sposobem na poradzenie sobie z tym jest zawinięcie skryptu w moduł obsługi wyjątków:

import sys
import arcpy

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

Nie jest to jednak szczególnie eleganckie i wymaga restrukturyzacji całego projektu, nie wspominając już o innym poziomie wcięcia. Ponadto w mało prawdopodobnej sytuacji, gdy inna część kodu wywołuje SystemExitwyjątek, o którym nigdy się nie dowiesz ... Kolejnym nieelegacyjnym, ale być może lepszym rozwiązaniem jest zawinięcie wywołań funkcji sys.exit () w innej funkcji:

import sys
import arcpy

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

#do stuff
finish()

Teraz możesz wywoływać finish(), finish(1)lub finish('Error message')tak jak oczekujesz, że będziesz mógł wywołać sys.exit ().

Oczywiście możemy chcieć zastosować nasze wyjątkowe podejście do jedzenia w innych okolicznościach, a ponieważ jest to Python, możemy uogólnić i stworzyć użyteczny, uniwersalny dekorator:

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
źródło