Wyjdź ze skryptu za pomocą Pythona

11

Mam skrypt Python dla ArcGIS, nad którym pracuję, i chciałbym mieć możliwość, aby skrypt został zamknięty, jeśli nie ma niezbędnych danych. Próbowałem prostej metody sys.exit (), ale dałoby to wyjątek w ArcMap, którego chciałbym uniknąć. Znalazłem ten wątek, który sugeruje użycie bloku try, więc utworzyłem tę funkcję:

def quit_script(message):
log_msg(message) # already defined; writes a message to a file
if log_loc:
    output.close() # close the file used with log_msg()
try:
    sys.exit()
except SystemExit:
    pass

Niestety to też nie działało. Cóż, to już nie powoduje tego błędu w ArcMap, ale też nie jest, no cóż, zakończone. W tej chwili mam większość mojego kodu w instrukcji if / else, ale to brzydkie. Czy ktoś ma jakieś inne sugestie?

Dzięki! Brian

Brian Buell
źródło
Teoretycznie sys.exit (0) to operacja zakończona pomyślnie zakończeniem - patrz msdn.microsoft.com/en-us/library/ms681381.aspx - ale podobnie jak Michael nie jestem w pobliżu ArcGIS, więc nie mogłem powiedzieć, jak to jest obsługiwane.
om_henners 22.04.11
Czy próbowałeś podnieść systemexit? Mam napisany program w języku Python, w którym używam tego podejścia w instrukcji if, próbując uzyskać listę funkcji w obszarze roboczym, a jeśli zwraca pustą listę, inne wywołania wywołują systemexit (działa świetnie - mam dużo wyjście pliku dziennika i drukowanie też trwa, więc mogę powiedzieć, dlaczego program się zakończył). Prawdopodobnie wiele sposobów na zrobienie tego i może nawet lepsze sposoby, ale ten robi to, czego się spodziewałem / chciałem.
turkishgold
4
Widziałeś przykłady w tym wątku GSE gis.stackexchange.com/questions/1015/…

Odpowiedzi:

2

Nie, blok try / try, którego będziesz potrzebować, będzie miał „catch”, który odbierze wywołanie wyjścia; więc w swojej próbie zrobiłbyś coś takiego:

try:
    if arcpy.Exists(parcelOutput):
    arcpy.AddMessage("Calculating Parcel Numbers")    
except:
    raise sys.exit("Error: " + arcpy.GetMessages(x))

Spowoduje to zapisanie, jeśli nie powiedzie się instrukcja „if”.

DEWright
źródło
Myślałem, że oprócz działa tylko wtedy, gdy jest błąd do złapania?
Chris Stayte,