Bagaimana cara menggunakan sys.exit (0) dalam skrip arcpy untuk keluar lebih awal tanpa menampilkan pesan kesalahan?


13

Saya memiliki skrip alat arcpy untuk ArcGIS 10.0 yang memiliki dua bagian fungsional utama. Pengguna dapat memilih untuk menjalankan bagian kedua atau tidak. Jika pengguna memilih TIDAK untuk menjalankan bagian kedua, saya hanya ingin menjalankan fungsi pembersihan dan keluar dari skrip dengan sys.exit (0) tanpa memiliki pesan kesalahan yang diposting ke jendela hasil alat. Ada dua utas utama di sini di GIS-SE tentang keluar dari skrip arcpy, tetapi solusi di dalamnya tidak secara khusus menangani pesan kesalahan. Struktur umum kode adalah sebagai berikut:

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

Jika saya menjalankan kode ini di interpreter Python di luar ArcGIS / arcpy, itu berfungsi seperti yang saya harapkan, keluar dengan anggun tanpa pesan kesalahan; Namun, dalam skrip arcpy saya dengan struktur yang sama ini, skrip keluar, tetapi pesan kesalahan SystemExit diposting ke jendela hasil alat. Apakah ada cara untuk membuat skrip alat arcpy memakan pengecualian dan mengubur pesan kesalahan SystemExit?


Hanya mengambil tikungan liar di sini, tetapi apakah mungkin Anda bisa "del arcpy" sebelum memanggil SystemExit dalam skrip Anda?

@Dan - Saya ragu, tapi itu ide yang menarik ... hmmm ... apa-apaan ini. Saya akan berputar.
celticflute

1
terima kasih telah memposting contoh kode ringkas yang dengan jelas menggambarkan logika dan meninggalkan tambahan. +1
matt wilkie

Jawaban:


8

Jawaban singkat: diperbaiki pada 10.1. Untuk saat ini, Anda perlu menambahkan lekukan ekstra. Ini mungkin mendorong beberapa refactoring berguna untuk kode Anda. Setiap kali Anda mendapatkan banyak baris dalam satu skrip / rutin, Anda tetap ingin memikirkan untuk memotongnya menjadi bagian yang lebih kecil (fungsi, kelas).

def main():
    <your code>

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

Terima kasih, Jason. Ya, saya harus menggigit peluru dan refactor. Sulit untuk melakukannya dengan klien bernapas di leher saya. Begitulah hidup.
celticflute

3

ArcPy mengacaukan lingkungan Python Anda . Singkatnya, jangan lakukan fungsi sys.exit () atau cari / panggil arcpy "clean-before-exit" (jika ada) sebelum memanggil sys.exit ().


2
Cara penanganan Python yang dapat dieksekusi sys.exit()adalah semacam trik kotor - panggilan exitmenimbulkan SystemExitpengecualian dan juru bahasa tingkat atas, yang biasanya mencetak traceback, akan mendeteksi jenis pengecualian dan mengakhiri juru bahasa. Menanamkan juru bahasa Python ke dalam aplikasi lain, seperti keluarga ArcGIS yang dapat dieksekusi, memerlukan sejumlah kode implementasi khusus seperti jumlah non-sepele seperti ini.
Jason Scheirer

2

Saya tidak tahu cara 'mengubur' pesan kesalahan SystemExit, tetapi Anda selalu bisa merestrukturisasi kode Anda untuk menghindari panggilan 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()

Benar, tetapi dua bagian dalam skrip arcpy saya agak besar. Saya lebih suka tidak membuat tingkat lekukan lain dan harus berurusan dengan masalah pelingkupan yang akan terjadi ... tetapi, ya, ini akan menjadi solusi. Apa yang benar-benar membuat frustrasi adalah bahwa pesan kesalahan hanya muncul ketika Anda menggunakan sys.exit di arcpy. Keluar dalam Python biasa pesan tidak diposting, karena pengecualian SystemExit tidak dianggap sebagai kesalahan.
celticflute
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.