Самозавершення сценарію Python в ArcMap?


17

Я спробував sys.exit, але, схоже, це не працює в ArcMap 10.

Хтось знає, як це зробити?

Відповіді:


16

З прикладів ArcPy , схоже, sys.exit()це правильний спосіб дострокового припинення сценарію.

Документація Python зазначає, що sys.exit():

реалізується шляхом підняття винятку SystemExit, тому дії очищення, визначені остаточно застереженнями випробувань, виконуються, і можливо перехопити спробу виходу на зовнішній рівень.

Найпростіший спосіб вирішити це - перетворити сценарій на обробку винятків:

import sys
import arcpy

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

Однак це не особливо елегантно і вимагає реструктуризації всього вашого проекту, не кажучи вже про інший рівень відступу. Плюс до того, що в іншій частині вашого коду виникає SystemExitвиняток, про який ви ніколи не дізнаєтесь ... Ще одне неелегантне, але, можливо, бажане рішення - перевести виклики на sys.exit () в іншу функцію:

import sys
import arcpy

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

#do stuff
finish()

Тепер ви можете зателефонувати finish(), finish(1)або finish('Error message')так, як ви очікуєте, що зможете зателефонувати на sys.exit ().

Звичайно, ми можемо захотіти використовувати свій підхід до прийому їжі за інших обставин, і оскільки це Python, ми можемо узагальнити та зробити корисний багатоцільовий декоратор:

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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.