J'ai un script d'outil arcpy pour ArcGIS 10.0 qui a deux sections fonctionnelles principales. L'utilisateur peut choisir d'exécuter ou non la deuxième section. Si l'utilisateur choisit de NE PAS exécuter la deuxième section, je veux simplement exécuter une fonction de nettoyage et quitter le script avec un sys.exit (0) sans avoir un message d'erreur publié dans la fenêtre des résultats de l'outil. Il existe deux fils principaux ici dans GIS-SE sur la sortie des scripts arcpy, mais les solutions qui y figurent ne traitent pas spécifiquement le message d'erreur. La structure générale du code est la suivante:
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 j'exécute ce code dans l'interpréteur Python en dehors d'ArcGIS / arcpy, cela fonctionne comme je m'y attendais, en quittant avec élégance sans message d'erreur; cependant, dans mon script arcpy avec cette même structure, le script se ferme, mais un message d'erreur SystemExit est publié dans la fenêtre de résultats de l'outil. Existe-t-il un moyen de faire en sorte que le script de l'outil arcpy mange l'exception et enterre le message d'erreur SystemExit?
la source
Réponses:
Réponse courte: corrigé dans 10.1. Pour l'instant, vous allez devoir ajouter un niveau supplémentaire d'indentation. Cela pourrait cependant encourager une refactorisation utile de votre code. Chaque fois que vous obtenez un grand nombre de lignes dans un seul script / routine, vous voudrez quand même penser à le découper en sections plus petites (fonctions, classes).
la source
ArcPy salit votre environnement Python . En bref, ne faites pas sys.exit () ou ne trouvez pas / n'appelez pas la fonction "nettoyage avant sortie" (s'il en existe une) avant d'appeler sys.exit ().
la source
sys.exit()
est une sorte d'astuce: l'appelexit
déclenche uneSystemExit
exception et l'interpréteur de niveau supérieur, qui imprime normalement un traceback, détectera le type d'exception et terminera l'interpréteur. L'incorporation d'un interpréteur Python dans une autre application, telle que la famille d'exécutables ArcGIS, nécessite une quantité non triviale de code spécifique à l'implémentation comme celui-ci.Je ne sais pas comment «enterrer» le message d'erreur SystemExit, mais vous pouvez toujours restructurer votre code pour éviter d'appeler sys.exit
la source