ฉันจะใช้ sys.exit (0) ในสคริปต์ arcpy เพื่อออกก่อนได้อย่างไรโดยไม่มีข้อความแสดงข้อผิดพลาดปรากฏขึ้น


13

ฉันมีสคริปต์เครื่องมือ arcpy สำหรับ ArcGIS 10.0 ที่มีหน้าที่หลักสองประการ ผู้ใช้สามารถเลือกว่าจะรันส่วนที่สองหรือไม่ หากผู้ใช้เลือกที่จะไม่เรียกใช้ส่วนที่สองฉันเพียงต้องการเรียกใช้ฟังก์ชันการล้างข้อมูลและออกจากสคริปต์ด้วย 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()

ถ้าฉันเรียกใช้รหัสนี้ในล่าม Python นอก ArcGIS / arcpy มันทำงานได้ตามที่ฉันคาดหวังออกอย่างสง่างามโดยไม่มีข้อผิดพลาด; อย่างไรก็ตามในสคริปต์ arcpy ของฉันที่มีโครงสร้างเดียวกันนี้สคริปต์จะออก แต่ข้อความแสดงข้อผิดพลาด SystemExit ถูกโพสต์ไปที่หน้าต่างผลลัพธ์ของเครื่องมือ มีวิธีที่จะทำให้สคริปต์เครื่องมือ arcpy กินข้อยกเว้นและฝังข้อความแสดงข้อผิดพลาด SystemExit หรือไม่


เพียงแค่แทงที่นี่ แต่เป็นไปได้ไหมที่คุณจะ "del arcpy" ก่อนที่จะเรียก SystemExit ในสคริปต์ของคุณ?

@ ด่าน - ฉันสงสัย แต่มันเป็นความคิดที่น่าสนใจ ... อืมมมม ... ฉันจะให้มันหมุนวน
celticflute

1
ขอบคุณสำหรับการโพสต์ตัวอย่างรหัสย่อซึ่งแสดงให้เห็นถึงตรรกะอย่างชัดเจนและทำให้ความพิเศษออกมา +1
แมตต์วิลคี

คำตอบ:


8

คำตอบสั้น ๆ : แก้ไขใน 10.1 สำหรับตอนนี้คุณจะต้องเพิ่มการเยื้องระดับพิเศษ สิ่งนี้อาจกระตุ้นให้มีการ refactoring รหัสของคุณ เมื่อใดก็ตามที่คุณได้รับบรรทัดจำนวนมากในสคริปต์ / ชุดคำสั่งเดียวคุณจะต้องนึกถึงการตัดมันออกเป็นส่วนย่อย ๆ (ฟังก์ชั่นชั้นเรียน)

def main():
    <your code>

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

ขอบคุณเจสัน ใช่ฉันควรกัดกระสุนและ refactor เป็นเรื่องยากที่จะทำเช่นนั้นกับลูกค้าที่หายใจคอของฉัน นั่นคือชีวิต.
celticflute

3

ArcPy ยุ่งกับสภาพแวดล้อมของคุณหลาม กล่าวโดยย่อคืออย่าใช้ sys.exit () หรือ find / call arcpy ของฟังก์ชั่น "cleanup-before-exit" (ถ้ามี) ฟังก์ชั่นก่อนเรียก sys.exit ()


2
วิธีการจัดการของ Python sys.exit()คือการเรียงลำดับของเล่ห์เหลี่ยม - การโทรexitทำให้เกิดSystemExitข้อยกเว้นและล่ามระดับบนสุดซึ่งปกติจะพิมพ์การติดตามกลับจะตรวจจับประเภทข้อยกเว้นและยุติล่าม การฝังตัวแปล Python ในแอปพลิเคชั่นอื่นเช่นชุดปฏิบัติการของตระกูล ArcGIS นั้นจำเป็นต้องใช้โค้ดเฉพาะสำหรับการติดตั้งแบบไม่ใช้งานเช่นนี้
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 ของฉันค่อนข้างใหญ่ ฉันไม่อยากสร้างอีกระดับของการเยื้องและต้องจัดการกับปัญหาการกำหนดขอบเขตที่จะตามมา ... แต่ใช่นี่จะเป็นวิธีแก้ปัญหา สิ่งที่น่าผิดหวังจริงๆคือข้อความแสดงข้อผิดพลาดปรากฏเฉพาะเมื่อคุณใช้ sys.exit ใน arcpy ใน Python ปกติจะไม่มีการโพสต์ข้อความเนื่องจาก SystemExit exception ไม่ถือเป็นข้อผิดพลาด
celticflute
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.