Come posso usare sys.exit (0) in uno script arcpy per uscire presto senza che venga visualizzato un messaggio di errore?


13

Ho uno script arcpy per ArcGIS 10.0 che ha due sezioni funzionali principali. L'utente può scegliere se eseguire o meno la seconda sezione. Se l'utente sceglie di NON eseguire la seconda sezione, desidero semplicemente eseguire una funzione di pulizia ed uscire dallo script con un sys.exit (0) senza avere un messaggio di errore pubblicato nella finestra dei risultati dello strumento. Ci sono due thread principali qui in GIS-SE sull'uscita da script arcpy, ma le soluzioni in esso non affrontano in modo specifico il messaggio di errore. La struttura generale del codice è la seguente:

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

Se eseguo questo codice nell'interprete Python al di fuori di ArcGIS / arcpy, funziona come mi aspettavo, uscendo con grazia senza alcun messaggio di errore; tuttavia, nel mio script arcpy con questa stessa struttura, lo script viene chiuso, ma un messaggio di errore SystemExit viene pubblicato nella finestra dei risultati dello strumento. C'è un modo per fare in modo che lo script dello strumento arcpy mangi l'eccezione e seppellisca il messaggio di errore di SystemExit?


Basta prendere una pugnalata selvaggia qui, ma è possibile che tu possa "del arcpy" prima di chiamare SystemExit nel tuo script?

@ Dan - Ne dubito, ma è un'idea interessante ... hmmm ... che diamine. Ci darò un vortice.
celticflute,

1
grazie per aver pubblicato un esempio di codice conciso che illustra chiaramente la logica e tralascia gli extra. +1
matt wilkie

Risposte:


8

Risposta breve: risolto in 10.1. Per ora, dovrai aggiungere un ulteriore livello di rientro. Questo potrebbe incoraggiare alcuni utili refactoring del tuo codice. Ogni volta che ottieni un gran numero di righe in un singolo script / routine, ti consigliamo di tagliare comunque in sezioni più piccole (funzioni, classi).

def main():
    <your code>

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

Grazie Jason. Sì, dovrei mordere il proiettile e il refactor. È difficile farlo con il cliente che mi fa respirare il collo. Così è la vita.
celticflute,

3

ArcPy fa casino con il tuo ambiente Python . In breve, o non eseguire sys.exit () o trovare / chiamare la funzione "cleanup-before-exit" di Arcpy (se presente) prima di chiamare sys.exit ().


2
Il modo in cui gestisce l'eseguibile di Python sys.exit()è una sorta di trucco sporco: la chiamata exitsolleva SystemExitun'eccezione e l'interprete di livello superiore, che normalmente stampa un traceback, rileverà il tipo di eccezione e terminerà l'interprete. Incorporare un interprete Python in un'altra applicazione, come la famiglia di eseguibili ArcGIS, richiede una quantità non banale di codice specifico dell'implementazione come questo.
Jason Scheirer,

2

Non so come "seppellire" il messaggio di errore di SystemExit, ma potresti sempre ristrutturare il codice per evitare di chiamare 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()

Vero, ma le due sezioni della mia sceneggiatura arcpica sono piuttosto enormi. Preferirei non creare ancora un altro livello di rientro e dover affrontare i problemi di scoping che ne conseguirebbero ... ma, sì, questa sarebbe una soluzione. La cosa davvero frustrante è che il messaggio di errore appare solo quando si utilizza sys.exit in arcpy. In Python normale il messaggio non viene pubblicato, poiché l'eccezione SystemExit non è considerata un errore.
celticflute,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.