Hata iletisi göstermeden erken çıkmak için bir arcpy komut dosyasında sys.exit (0) nasıl kullanabilirim?


13

ArcGIS 10.0 için iki büyük fonksiyonel bölümü olan bir arcpy aracı komut dosyası var. Kullanıcı ikinci bölümün çalıştırılıp çalıştırılmayacağını seçebilir. Kullanıcı ikinci bölümü çalıştırmak DEĞİL seçerse, ben sadece bir temizleme işlevini çalıştırmak ve araç sonuçları penceresine bir hata iletisi gönderilmeden bir sys.exit (0) ile komut dosyasından çıkmak istiyorum . Burada CBS-SE'de arcpy betiklerinden çıkma konusunda iki ana konu vardır, ancak buradaki çözümler özellikle hata mesajına değinmemektedir. Kodun genel yapısı aşağıdaki gibidir:

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

Bu kodu ArcGIS / arcpy dışında Python yorumlayıcıda çalıştırırsam, beklediğim gibi çalışır, hata iletisi olmadan incelikle çıkar; ancak, aynı yapıya sahip arkpy komut dosyasında komut dosyası çıkar, ancak araç sonuçları penceresine bir SystemExit hata iletisi gönderilir. Arcpy aracı komut dosyasının özel durumu yemesi ve SystemExit hata iletisini gömmesinin bir yolu var mı?


Sadece burada vahşi bir bıçak alarak, ama sen script "SystemExit çağırmadan önce" del arcpy "olabilir mi?

@Dan - Bundan şüphe ediyorum, ama ilginç bir fikir ... hmmm ... ne halt. Ben bir koşuşturma vereceğim.
celticflute

1
mantığı açıkça gösteren ve ekstraları bırakan özlü kod örneği gönderdiğiniz için teşekkür ederiz. +1
matt wilkie

Yanıtlar:


8

Kısa cevap: 10.1'de düzeltildi. Şimdilik, fazladan bir girinti eklemeniz gerekecek. Bu, kodunuza bazı yararlı yeniden düzenleme yapılmasını teşvik edebilir. Tek bir komut dosyasında / rutinde çok sayıda satır bulduğunuzda, yine de daha küçük bölümlere (işlevler, sınıflar) ayırmayı düşünmek istersiniz.

def main():
    <your code>

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

Teşekkürler, Jason. Evet, mermiyi ve refaktörü ısırmalıyım. İstemcinin boynumu solumasıyla bunu yapmak zor. Hayat böyle.
celticflute

3

ArcPy , Python ortamınızla uğraşır . Kısacası, sys.exit () yöntemini kullanmayın ya da arcpy'nin "çıkmadan önce temizleme" (varsa) işlevini bulmayın / çağırmayın.


2
Python'un yürütülebilir dosyasının işleyişi sys.exit()bir tür kirli numaradır - çağrı exitbir SystemExitistisna oluşturur ve normalde bir geri izleme basan üst düzey yorumlayıcı istisna türünü algılar ve yorumlayıcıyı sonlandırır. Bir Python yorumlayıcısını ArcGIS yürütülebilir dosyaları ailesi gibi başka bir uygulamaya gömmek, bunun gibi önemsiz miktarda uygulamaya özgü kod gerektirir.
Jason Scheirer

2

SystemExit hata iletisini nasıl gömeceğimi bilmiyorum, ancak sys.exit çağrılmasını önlemek için her zaman kodunuzu yeniden yapılandırabilirsiniz

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

Doğru, ama benim arcpy senaryomdaki iki bölüm oldukça büyük. Başka bir girinti seviyesi oluşturmayı tercih etmem ve ortaya çıkabilecek kapsam belirleme sorunlarıyla uğraşmak zorunda kalmam ... ama evet, bu bir çözüm olurdu. Gerçekten sinir bozucu olan şey hata mesajının sadece arcpy içinde sys.exit kullandığınızda görünmesidir. SystemExit istisnası bir hata olarak değerlendirilmediğinden, normal Python'da ileti gönderilmez.
celticflute
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.