Comment utiliser sys.exit (0) dans un script arcpy pour quitter tôt sans qu'un message d'erreur ne s'affiche?

13

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?

flûte celtique
la source
Je prends juste un coup de fou ici, mais est-il possible que vous puissiez "del arcpy" avant d'appeler le SystemExit dans votre script?
@Dan - J'en doute, mais c'est une idée intéressante ... hmmm ... que diable. Je vais lui faire un tourbillon.
celticflute
1
merci d'avoir publié un exemple de code concis qui illustre clairement la logique et laisse de côté les extras. +1
matt wilkie

Réponses:

8

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

def main():
    <your code>

if __name__ == "__main__":
    try:
        main()
    except SystemExit as err:
        pass
Jason Scheirer
la source
Merci, Jason. Oui, je devrais mordre la balle et refactoriser. C'est juste difficile de faire ça avec le client qui respire dans mon cou. C'est la vie.
celticflute
3

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

Howard Butler
la source
2
La façon dont l'exécutable de Python gère sys.exit()est une sorte d'astuce: l'appel exitdéclenche une SystemExitexception 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.
Jason Scheirer
2

Je ne sais pas comment «enterrer» le message d'erreur SystemExit, mais vous pouvez toujours restructurer votre code pour éviter d'appeler 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()
user2856
la source
C'est vrai, mais les deux sections de mon script arcpy sont plutôt énormes. Je préférerais ne pas créer encore un autre niveau d'indentation et devoir faire face aux problèmes de cadrage qui en découleraient ... mais, oui, ce serait une solution. Ce qui est vraiment frustrant, c'est que le message d'erreur n'apparaît que lorsque vous utilisez sys.exit dans arcpy. En Python normal, le message n'est pas publié, car l'exception SystemExit n'est pas considérée comme une erreur.
celticflute