Як я можу використовувати sys.exit (0) в архівному скрипті для раннього виходу без появи повідомлення про помилку?


13

У мене є скрипт інструменту 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, він працює так, як я очікував, виходячи витончено без повідомлення про помилку; однак у моєму аркпійному сценарії з цією ж структурою сценарій виходить, але повідомлення про помилку SystemExit розміщується у вікні результатів інструменту. Чи є спосіб змусити скрипт інструменту arcpy з'їсти виняток і поховати повідомлення про помилку SystemExit?


Тут просто зробили дику колючку, але чи можливо, ви могли б "del arcpy", перш ніж викликати SystemExit у своєму сценарії?

@Dan - я сумніваюся, але це цікава ідея ... хммм ... що за чорт. Я дам йому кружляння.
кельтфлют

1
дякую за публікацію стислого прикладу коду, який чітко ілюструє логіку та не залишає зайвих. +1
matt wilkie

Відповіді:


8

Коротка відповідь: фіксовано в 10.1. Наразі вам потрібно буде додати додатковий рівень відступу. Це, однак, може спонукати до корисного рефакторингу на ваш код. Кожен раз, коли ви отримаєте велику кількість рядків в одному сценарії / рутині, ви все одно захочете подумати над тим, щоб розрізати його на менші розділи (функції, класи).

def main():
    <your code>

if __name__ == "__main__":
    try:
        main()
    except SystemExit as err:
        pass

Спасибі, Джейсон. Так, я повинен кусати кулю і рефактор. Це просто важко зробити, коли клієнт дихає мені по шиї. Таке життя.
celticflute

3

ArcPy спілкується з вашим середовищем Python . Коротше кажучи, перед тим, як викликати sys.exit (), не виконуйте sys.exit () або знаходьте / викликайте функцію arcpy "очищення до виходу" (якщо така існує).


2
Те, як виконуються ручки Python sys.exit()- це свого роду брудний трюк - виклик exitвикликає SystemExitвиняток, і інтерпретатор верхнього рівня, який, як правило, друкує прослідку, виявить тип виключення та припинить інтерпретатора. Вбудовування інтерпретатора Python в інший додаток, такий як сімейство виконуваних файлів ArcGIS, вимагає нетривіального обсягу коду для виконання, такого як цей.
Jason Scheirer

2

Я не знаю, як "поховати" повідомлення про помилку SystemExit, але ви завжди можете реструктурувати свій код, щоб уникнути виклику sys.exit

import sys
##import arcpy

def DoMoreStuff():
    print 'doing more stuff ...'

def CleanUp():
    print 'Cleaning up ...'

def finish():
    CleanUp()
    print 'Exiting ...'

do_more = False  #or True ... input from user

#Section 1:  do some stuff
print 'Doing some stuff ...'

if do_more:DoMoreStuff()

finish()

Щоправда, але два розділи в моєму аркпійському сценарії досить величезні. Я б швидше не створив ще один рівень відступу і мав би мати справу з питаннями розміщення, які виникли б у цьому… але, так, це було б рішенням. Що насправді засмучує те, що повідомлення про помилку з’являється лише тоді, коли ви використовуєте sys.exit в arcpy. У звичайному Python повідомлення не публікується, оскільки виняток SystemExit не вважається помилкою.
кельтфлют
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.