У меня есть скрипт инструмента arcpy для ArcGIS 10.0, который имеет два основных функциональных раздела. Пользователь может выбрать, следует ли запускать второй раздел. Если пользователь выбирает НЕ запускать второй раздел, я просто хочу запустить функцию очистки и выйти из сценария с помощью sys.exit (0), не отправляя сообщение об ошибке в окно результатов инструмента. Здесь, в GIS-SE, есть два основных потока о выходе из скриптов arcpy, но решения в них специально не обращаются к сообщению об ошибке. Общая структура кода выглядит следующим образом:
import sys
##import arcpy
def CleanUp():
print 'Cleaning up ...\n'
def finish():
CleanUp()
print 'Exiting ...'
sys.exit(0)
do_more = False #or True ... input from user
#Section 1: do some stuff
print 'Doing some stuff ...\n'
if not do_more:
finish()
#Section 2: do more stuff
print 'doing more stuff ...'
CleanUp()
Если я запускаю этот код в интерпретаторе Python за пределами ArcGIS / arcpy, он работает, как и ожидалось, изящно завершается без сообщения об ошибке; однако в моем скрипте arcpy с такой же структурой скрипт завершается, но сообщение об ошибке SystemExit отправляется в окно результатов инструмента. Есть ли способ заставить скрипт инструмента arcpy съесть исключение и скрыть сообщение об ошибке SystemExit?
источник
Ответы:
Краткий ответ: исправлено в 10.1. На данный момент вам нужно добавить дополнительный уровень отступа. Это может способствовать некоторому полезному рефакторингу вашего кода. Каждый раз, когда вы получаете большое количество строк в одном скрипте / подпрограмме, вы все равно должны подумать о том, чтобы разрезать его на более мелкие разделы (функции, классы).
источник
ArcPy портит вашу среду Python . Короче говоря, либо не выполняйте sys.exit (), ни находите / вызывайте функцию arcpy «cleanup-before-exit» (если она существует) перед вызовом sys.exit ().
источник
sys.exit()
являются своего рода подвохом - вызовexit
вызываетSystemExit
исключение, и интерпретатор верхнего уровня, который обычно печатает трассировку, обнаружит тип исключения и завершит работу интерпретатора. Встраивание интерпретатора Python в другое приложение, такое как исполняемые файлы семейства ArcGIS, требует нетривиального количества кода, специфичного для реализации, такого как этот.Я не знаю, как «похоронить» сообщение об ошибке SystemExit, но вы всегда можете реструктурировать свой код, чтобы избежать вызова sys.exit
источник