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?
fuente
Respuestas:
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.
fuente
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 ().
fuente
sys.exit()
es una especie de truco sucio: llamarexit
genera unaSystemExit
excepció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.No sé cómo 'enterrar' el mensaje de error SystemExit, pero siempre puede reestructurar su código para evitar llamar a sys.exit
fuente