오류 메시지가 표시되지 않고 arcpy 스크립트에서 sys.exit (0)을 사용하여 일찍 종료하려면 어떻게해야합니까?


13

ArcGIS 10.0에 대한 두 가지 주요 기능 섹션이있는 arcpy 도구 스크립트가 있습니다. 사용자는 두 번째 섹션을 실행할지 여부를 선택할 수 있습니다. 사용자가 두 번째 섹션을 실행하지 않기로 선택한 경우 도구 결과 창에 오류 메시지가 표시되지 않고 정리 기능을 실행하고 sys.exit (0)으로 스크립트를 종료 하려고합니다. GIS-SE에는 arcpy 스크립트 종료에 관한 두 가지 주요 스레드가 있지만 그 해결책은 오류 메시지를 구체적으로 다루지 않습니다. 코드의 일반적인 구조는 다음과 같습니다.

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

ArcGIS / arcpy 외부의 Python 인터프리터에서이 코드를 실행하면 예상대로 작동하며 오류 메시지없이 정상적으로 종료됩니다. 그러나이 동일한 구조의 arcpy 스크립트에서는 스크립트가 종료되지만 SystemExit 오류 메시지가 도구 결과 창에 게시됩니다. arcpy 도구 스크립트가 예외를 먹고 SystemExit 오류 메시지를 묻는 방법이 있습니까?


여기서 찌르기 만했지만 스크립트에서 SystemExit를 호출하기 전에 "del arcpy"를 할 수 있습니까?

@ Dan-나는 그것을 의심하지만 흥미로운 아이디어입니다 ... 흠 ... 도대체. 나는 소용돌이를 줄 것이다.
celticflute

1
논리를 명확하게 설명하고 추가 사항을 생략하는 간결한 코드 예제를 게시 해 주셔서 감사합니다. +1
matt wilkie

답변:


8

짧은 답변 : 10.1에서 수정되었습니다. 지금은 들여 쓰기 수준을 추가해야합니다. 그래도 코드에 유용한 리팩토링을 권장 할 수 있습니다. 단일 스크립트 / 루틴에서 많은 수의 행을 얻을 때마다 더 작은 섹션 (함수, 클래스)으로 자르는 것을 생각하고 싶을 것입니다.

def main():
    <your code>

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

고마워, 제이슨 예, 총알을 물고 리팩터링해야합니다. 클라이언트가 내 목을들이 마시면서 그렇게하기가 어렵습니다. 그런 삶입니다.
celticflute

3

ArcPy는 Python 환경을 망칩니다 . 간단히 말해 sys.exit ()를 수행하지 말고 sys.exit ()를 호출하기 전에 arcpy의 "exit-exfore-exit"(있는 경우) 함수를 찾아 / 호출하십시오.


2
파이썬의 실행 핸들하는 방식 sys.exit()더러운 트릭의 일종이다 - 전화가 exit제기 SystemExit일반적으로 역 추적을 인쇄 예외 최상위 통역은 예외 유형을 감지하고 인터프리터를 종료합니다. ArcGIS 실행 파일 제품군과 같은 다른 응용 프로그램에 Python 인터프리터를 포함 시키려면 이와 같은 사소한 양의 구현 별 코드가 필요합니다.
Jason Scheirer

2

SystemExit 오류 메시지를 '매장'하는 방법을 모르지만 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()

사실이지만, 내 arcpy 스크립트의 두 섹션은 다소 큽니다. 차라리 또 다른 수준의 들여 쓰기를 만들지 않고 발생할 수있는 범위 지정 문제를 처리해야하지만 ... 그렇습니다. 이것이 해결책이 될 것입니다. 정말 실망스러운 점은 python.sys에서 sys.exit를 사용할 때만 오류 메시지가 나타납니다. 일반 Python에서는 SystemExit 예외가 오류로 간주되지 않으므로 메시지가 게시되지 않습니다.
celticflute
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.