Самодействующий скрипт Python в ArcMap?

17

Я пытался sys.exit, но это не работает в ArcMap 10.

Кто-нибудь знает, как это сделать?

дубильщик
источник

Ответы:

16

Из примеров ArcPy кажется, что sys.exit()это правильный способ досрочного завершения скрипта.

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

реализуется путем вызова исключения SystemExit, поэтому действия по очистке, указанные в предложениях finally операторов try, соблюдаются, и можно перехватить попытку выхода на внешнем уровне.

Самый простой способ справиться с этим - обернуть ваш скрипт в обработчик исключений:

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()
fmark
источник