Como uso o sys.exit (0) em um script arcpy para sair mais cedo sem que seja exibida uma mensagem de erro?

13

Eu tenho um script de ferramenta arcpy para ArcGIS 10.0 que possui duas seções funcionais principais. O usuário pode optar por executar ou não a segunda seção. Se o usuário optar por NÃO executar a segunda seção, simplesmente desejo executar uma função de limpeza e sair do script com um sys.exit (0) sem ter uma mensagem de erro postada na janela de resultados da ferramenta. Existem dois tópicos principais aqui no GIS-SE sobre a saída de scripts arcpy, mas as soluções contidas nele não tratam especificamente da mensagem de erro. A estrutura geral do código é a seguinte:

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 eu executar esse código no interpretador Python fora do ArcGIS / arcpy, ele funcionará como seria de esperar, saindo normalmente sem nenhuma mensagem de erro; no entanto, no meu script arcpy com essa mesma estrutura, o script é encerrado, mas uma mensagem de erro SystemExit é postada na janela de resultados da ferramenta. Existe uma maneira de fazer com que o script da ferramenta arcpy coma a exceção e oculte a mensagem de erro SystemExit?

flauta celta
fonte
Apenas dando uma facada selvagem aqui, mas é possível que você possa "del arcpy" antes de chamar o SystemExit no seu script?
@ Dan - duvido, mas é uma ideia interessante ... hmmm ... que diabos. Vou dar uma volta.
Celticflute
1
obrigado por postar um exemplo de código conciso que ilustra claramente a lógica e deixa de fora os extras. 1
matt wilkie

Respostas:

8

Resposta curta: corrigida em 10.1. Por enquanto, você precisará adicionar um nível extra de recuo. Isso pode incentivar algumas refatorações úteis ao seu código. Sempre que você obtiver um grande número de linhas em um único script / rotina, pense em dividi-lo em seções menores (funções, classes) de qualquer maneira.

def main():
    <your code>

if __name__ == "__main__":
    try:
        main()
    except SystemExit as err:
        pass
Jason Scheirer
fonte
Obrigado Jason. Sim, eu deveria morder a bala e refatorar. É difícil fazer isso com o cliente respirando no meu pescoço. Como a vida.
Celticflute
3

O ArcPy mexe com o seu ambiente Python . Em resumo, não execute sys.exit () ou localize / chame a função "cleanup-before-exit" (se houver) da arcpy antes de chamar sys.exit ().

Howard Butler
fonte
2
A maneira como o executável do Python manipula sys.exit()é uma espécie de truque sujo - chamar exitgera uma SystemExitexceção e o intérprete de nível superior, que normalmente imprime um retorno, detectará o tipo de exceção e encerrará o intérprete. A incorporação de um intérprete Python em outro aplicativo, como a família de executáveis ​​ArcGIS, requer uma quantidade não trivial de código específico da implementação, como este.
precisa saber é o seguinte
2

Não sei como enterrar a mensagem de erro SystemExit, mas você sempre pode reestruturar seu código para evitar chamar 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
fonte
É verdade, mas as duas seções do meu script arcpy são enormes. Eu preferiria não criar outro nível de indentação e ter que lidar com os problemas de escopo que se seguiriam ... mas, sim, isso seria uma solução. O que é realmente frustrante é que a mensagem de erro aparece apenas quando você usa o sys.exit no arcpy. No Python comum, a mensagem não é publicada, porque a exceção SystemExit não é considerada um erro.
Celticflute 31/08