¿Cómo uso sys.exit (0) en un script arcpy para salir temprano sin que aparezca un mensaje de error?

13

Tengo un script de herramienta arcpy para ArcGIS 10.0 que tiene dos secciones funcionales principales. El usuario puede elegir si ejecutar o no la segunda sección. Si el usuario elige NO ejecutar la segunda sección, simplemente quiero ejecutar una función de limpieza y salir del script con un sys.exit (0) sin tener un mensaje de error publicado en la ventana de resultados de la herramienta. Hay dos hilos principales aquí en GIS-SE sobre la salida de scripts arcpy, pero las soluciones no abordan específicamente el mensaje de error. La estructura general del código es la siguiente:

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()

Si ejecuto este código en el intérprete de Python fuera de ArcGIS / arcpy, funciona como esperaba, saliendo con gracia sin mensaje de error; sin embargo, en mi script arcpy con esta misma estructura, el script se cierra, pero se publica un mensaje de error SystemExit en la ventana de resultados de la herramienta. ¿Hay alguna manera de hacer que el script de la herramienta arcpy coma la excepción y entierre el mensaje de error SystemExit?

celta
fuente
Solo tomo una puñalada salvaje aquí, pero ¿es posible que pueda "del arcpy" antes de llamar a SystemExit en su script?
@Dan - Lo dudo, pero es una idea interesante ... hmmm ... qué diablos. Le daré un giro.
celticflute
1
gracias por publicar un ejemplo de código conciso que ilustra claramente la lógica y deja de lado los extras. +1
matt wilkie

Respuestas:

8

Respuesta corta: corregida en 10.1. Por ahora, necesitará agregar un nivel adicional de sangría. Sin embargo, esto podría fomentar una refactorización útil de su código. Cada vez que obtenga una gran cantidad de líneas en un solo script / rutina, querrá pensar en cortarlo en secciones más pequeñas (funciones, clases) de todos modos.

def main():
    <your code>

if __name__ == "__main__":
    try:
        main()
    except SystemExit as err:
        pass
Jason Scheirer
fuente
Gracias Jason. Sí, debería morder la bala y refactorizar. Es difícil hacer eso con el cliente respirando por mi cuello. Así es la vida.
celticflute
3

ArcPy se mete con su entorno Python . En resumen, no haga sys.exit () o encuentre / llame a la función "cleanup-before-exit" (si existe) de arcpy antes de llamar a sys.exit ().

Howard Butler
fuente
2
La forma en que maneja el ejecutable de Python sys.exit()es una especie de truco sucio: llamar exitgenera una SystemExitexcepción y el intérprete de nivel superior, que normalmente imprime un rastreo, detectará el tipo de excepción y terminará el intérprete. Incrustar un intérprete de Python en otra aplicación, como la familia de ejecutables ArcGIS, requiere una cantidad no trivial de código específico de implementación como este.
Jason Scheirer
2

No sé cómo 'enterrar' el mensaje de error SystemExit, pero siempre puede reestructurar su código para evitar llamar a 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()
usuario2856
fuente
Es cierto, pero las dos secciones en mi script arcpy son bastante grandes. Preferiría no crear otro nivel de sangría y tener que lidiar con los problemas de alcance que se producirían ... pero, sí, esta sería una solución. Lo que es realmente frustrante es que el mensaje de error aparece solo cuando usa sys.exit en arcpy. En Python normal, el mensaje no se publica, porque la excepción SystemExit no se considera un error.
celticflute