Jestem świadomy die()
polecenia w PHP, które wcześnie wychodzi ze skryptu.
Jak mogę to zrobić w Pythonie?
źródło
Jestem świadomy die()
polecenia w PHP, które wcześnie wychodzi ze skryptu.
Jak mogę to zrobić w Pythonie?
import sys
sys.exit()
szczegóły z sys
dokumentacji modułu :
sys.exit([arg])
Wyjdź z Pythona. Jest to realizowane przez podniesienie
SystemExit
wyjątku, więc działania czyszczące określone w klauzulachtry
instrukcji wreszcie są honorowane i możliwe jest przechwycenie próby wyjścia na poziomie zewnętrznym.Opcjonalnym argumentem arg może być liczba całkowita podająca status wyjścia (domyślnie zero) lub inny typ obiektu. Jeśli jest liczbą całkowitą, zero jest uważane za „pomyślne zakończenie”, a każda niezerowa wartość jest uważana za „nienormalne zakończenie” przez powłoki i tym podobne. Większość systemów wymaga, aby znajdowała się w przedziale 0–127, aw przeciwnym razie daje niezdefiniowane wyniki. Niektóre systemy mają konwencję nadawania określonych znaczeń określonym kodom wyjścia, ale są one na ogół słabo rozwinięte; Programy uniksowe zwykle używają 2 dla błędów składni wiersza poleceń i 1 dla wszystkich innych rodzajów błędów. Jeśli przekazany zostanie inny typ obiektu, Żaden nie jest równoważny przekazaniu zera, a każdy inny obiekt jest drukowany do
stderr
i powoduje kod wyjścia 1. W szczególności,sys.exit("some error message")
to szybki sposób na zamknięcie programu w przypadku wystąpienia błędu.Ponieważ
exit()
ostatecznie „tylko” wywołuje wyjątek, proces zostanie zakończony dopiero po wywołaniu z głównego wątku, a wyjątek nie zostanie przechwycony.
Pamiętaj, że jest to „miły” sposób na wyjście. @ glyphtwistedmatrix poniżej wskazuje, że jeśli chcesz „twardego wyjścia”, możesz go użyć os._exit(*errorcode*)
, chociaż prawdopodobnie jest on do pewnego stopnia specyficzny dla systemu operacyjnego (na przykład może nie brać kodu błędu w systemie Windows) i zdecydowanie jest mniej przyjazny, ponieważ jest nie pozwala tłumaczowi wykonać żadnego czyszczenia przed śmiercią procesu.
sys.exit()
nie działa (nie zabija procesu, po prostu zabija wątek), jeśli zostanie podniesiony przez wątek w tle?sys.exit()
podnosiSystemExit
wyjątek w bieżącym wątku.UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Prostym sposobem wcześniejszego zakończenia skryptu Python jest użycie wbudowanej
quit()
funkcji. Nie ma potrzeby importowania żadnej biblioteki, a jest to wydajne i proste.Przykład:
źródło
Innym sposobem jest:
źródło
sys.exit
Możesz także użyć po prostu
exit()
.Należy pamiętać, że
sys.exit()
,exit()
,quit()
, ios._exit(0)
zabić interpreter Pythona. Dlatego jeśli pojawia się w skrypcie wywoływanym z innego skryptu przezexecfile()
, zatrzymuje wykonywanie obu skryptów.Zobacz „ Zatrzymaj wykonywanie skryptu wywoływanego z plikiem wykonywalnym ”, aby tego uniknąć.
źródło
Chociaż ogólnie powinieneś preferować,
sys.exit
ponieważ jest on bardziej „przyjazny” dla innego kodu, wszystko, co faktycznie robi, to podniesienie wyjątku.Jeśli masz pewność, że musisz natychmiast wyjść z procesu i być może znajdujesz się w jakimś module obsługi wyjątków, który może się wyłapać
SystemExit
, istnieje inna funkcja -os._exit
- która kończy się natychmiast na poziomie C i nie wykonuje żadnego normalnego usuwania tłumacza; na przykład haki zarejestrowane w module „atexit” nie są wykonywane.źródło
Właśnie dowiedziałem się, że podczas pisania multithreadded aplikację,
raise SystemExit
asys.exit()
zarówno zabija tylko wątkiem. Z drugiej stronyos._exit()
wychodzi z całego procesu. Zostało to omówione w „ Dlaczego sys.exit () nie kończy działania po wywołaniu wewnątrz wątku w Pythonie? ”.Poniższy przykład ma 2 wątki. Kenny and Cartman. Cartman ma żyć wiecznie, ale Kenny jest nazywany rekurencyjnie i powinien umrzeć po 3 sekundach. (dzwonienie rekurencyjne nie jest najlepszym sposobem, ale miałem inne powody)
Jeśli chcemy również, aby Cartman umarł, gdy Kenny umiera, Kenny powinien odejść
os._exit
, w przeciwnym razie tylko Kenny umrze, a Cartman będzie żył wiecznie.źródło
Jako parametr możesz przekazać kod wyjścia, który zostanie zwrócony do systemu operacyjnego. Domyślnie 0.
źródło
exit()
isys.exit()
to nie to samo. Nie używaj wbudowanychexit()
skryptów, jest to tylko pomocnik dla interaktywnej powłoki - użyjsys.exit()
Jestem całkowitym nowicjuszem, ale na pewno jest to czystsze i bardziej kontrolowane
...
niż
...
Edytować
Chodzi o to, że program kończy się płynnie i spokojnie, zamiast „ZATRZYMAŁEM SIĘ !!!!”
źródło
return
do zakończenia skryptu. Wszystko, coreturn
robi, to zwrócenie wartości i przepływ kontroli do funkcji wywołującej. Tam kontynuuje wykonywanie zaraz po wywołaniu funkcji, która wywołałareturn
. Oczywiście, jeślireturn
jest to ostatnia instrukcja w twoim skrypcie, tak jak w twoim przykładzie, skrypt jest kończony zaraz po jego wywołaniu.exit
- stąd programiści pythonowi mogą nie zauważyć smrodu tego kodu); i wreszcie (3) wielowątkowy kod (który pythoniści historycznie po prostu ignorowali).W Pythonie 3.5 próbowałem włączyć podobny kod bez użycia modułów (np. Sys, Biopy) innych niż wbudowane, aby zatrzymać skrypt i wydrukować komunikat o błędzie moim użytkownikom. Oto mój przykład:
Później stwierdziłam, że bardziej zwięzłe jest po prostu zgłoszenie błędu:
źródło
Moje dwa centy.
Python 3.8.1, Windows 10, 64-bit.
sys.exit()
nie działa bezpośrednio dla mnie.Mam kilka następnych pętli.
Najpierw deklaruję zmienną boolowską, którą nazywam
immediateExit
.Tak więc na początku kodu programu piszę:
Następnie, zaczynając od najbardziej wewnętrznego (zagnieżdżonego) wyjątku pętli, piszę:
Następnie przechodzę do bezpośredniej kontynuacji zewnętrznej pętli i zanim cokolwiek zostanie wykonane przez kod, piszę:
W zależności od złożoności, czasami powyższe stwierdzenie należy powtórzyć również w wyjątkach, itp.
Niestandardowy komunikat służy również do mojego osobistego debugowania, ponieważ liczby są w tym samym celu - aby zobaczyć, gdzie skrypt naprawdę się kończy.
W moim szczególnym przypadku przetwarzam plik CSV, którego nie chcę, aby oprogramowanie dotykało, jeśli oprogramowanie wykryje, że jest uszkodzony. Dlatego dla mnie bardzo ważne jest, aby wyjść z całego skryptu Python natychmiast po wykryciu możliwego uszkodzenia.
I postępując zgodnie ze stopniowym sys.exinging ze wszystkich pętli, udaje mi się to zrobić.
Pełny kod: (konieczne były pewne zmiany, ponieważ jest to zastrzeżony kod do zadań wewnętrznych):
źródło
except:
bez typu wyjątku. Jeśli po prostu użyjeszexcept Exception:
(lub nawet bardziej szczegółowy typ wyjątku, jeśli to możliwe),sys.exit()
będzie działać zgodnie z przeznaczeniem i nie będziesz potrzebować tego obejścia.sys.exit()
jest naprawdę rodzajem ostatecznego rozwiązania krytycznych błędów. Tylko moje dwa centy :)