dzisiaj zajmiemy się tematem kończenia/kończenia skryptów Pythona! Zanim zaczniemy, powinieneś mieć podstawową wiedzę na temat tego, czym jest Python i trochę podstawowej wiedzy na temat jego użycia.
Możesz użyć wybranego IDE, ale tym razem użyję pakietu Microsoft Linux Subsystem for Windows (WSL). Aby uzyskać więcej informacji na ten temat i jak włączyć go w systemie Windows 10, przejdź tutaj.
spis treści
dlaczego Python automatycznie opuszcza skrypt po jego zakończeniu?,
sposób, w jaki Python wykonuje blok kodu sprawia, że wykonuje on każdą linię w kolejności, sprawdzając zależności do zaimportowania, czytając definicje i klasy do przechowywania w pamięci oraz wykonując fragmenty kodu w kolejności pozwalającej na pętle i wywołania z powrotem do zdefiniowanych definicji i klas.
Kiedy interpreter Pythona dotrze do końca pliku (EOF), zauważy, że nie może odczytać więcej danych ze źródła, niezależnie od tego, czy są to dane wejściowe użytkownika przez IDE, czy odczyt z pliku. Aby zademonstrować, spróbujmy wprowadzić dane użytkownika i przerwać interpreter w trakcie wykonywania!,
najpierw z terminala bash w PowerShell Otwórz nowy plik o nazwie „input.,n wklej następujący tekst do powłoki, klikając prawym przyciskiem myszy na oknie PowerShell
name=input("Don"t type anything!\n")print("Hi,",name,"!")
Teraz naciśnij CTRL+X
aby zapisać i zamknąć okno nano i w powłoce wpisz:
$ python3 input.pyDon"t type anything!
i naciśnij CTRL+D
aby zakończyć program podczas oczekiwania na wejście użytkownika
Traceback (most recent call last):File "input.py", line 1, in name=input("Don"t type anything!")EOFError
wyjątek EOFError
mówi nam, że interpreter Pythona uderzył w stan końca pliku (EOF) przed zakończył wykonywanie kodu, ponieważ użytkownik nie wprowadził żadnych danych wejściowych.,
gdy Python osiągnie warunek EOF w tym samym czasie, że wykonał cały kod bez rzucania żadnych WYJĄTKÓW, co jest jednym ze sposobów, w jaki Python może wyjść ” z gracją.”
Detect script exit
Jeśli chcemy powiedzieć, kiedy program w Pythonie kończy działanie bez rzucania wyjątku, możemy użyć wbudowanego modułuatexit
.
atexit
obsługuje wszystko, co chcemy, aby program robił po jego zakończeniu i jest zwykle używany do czyszczenia programu przed zakończeniem procesu
aby poeksperymentować z atexit, zmodyfikujmy nasze dane wejściowe.,py przykład, aby wydrukować wiadomość przy wyjściu programu. Otwórz input.py plik ponownie i zastąp tekst tym
import atexitatexit.register(print,"Program exited successfully!")name=input("What"s your name?\n")print("Hi,",name,"!")
wpisz swoją nazwę, a po naciśnięciu enter powinieneś uzyskać:
What"s your name?ExampleHi, Example !Program exited successfully!
zauważ, jak tekst wyjścia pojawia się na końcu wyjścia bez względu na to, gdzie umieścimy atexit
I jak, jeśli zastąpimy tekst atexit
wywołanie prostym print()
, otrzymujemy tekst wyjścia, gdzie print()
wszystkie zostały wykonane, a nie gdzie kod kończy.,
Program exited successfully!What"s your name?ExampleHi, Example !
Graceful exit
istnieje kilka sposobów wyjścia z programu Pythona, który nie wymaga rzucania wyjątku.można użyć polecenia bash echo $?
, aby uzyskać kod wyjścia interpretera Pythona.,
możemy również zdefiniować typ kodu, który interpreter powinien zakończyć przekazując quit()
argument liczb całkowitych mniejszy niż 256
exit()
ma taką samą funkcjonalność, jak alias dla quit()
ani quit()
NOR exit()
są uważane za dobrą praktykę, ponieważ oba wymagają modułu site
, który ma być używany dla interaktywnych tłumaczy, a nie w programach., W przypadku naszych programów powinniśmy użyć czegoś w rodzaju sys.exit
zauważ, że musimy jawnie zaimportować moduł do wywołania exit()
, może to wydawać się nie poprawą, ale gwarantuje, że niezbędny moduł zostanie załadowany, ponieważ nie jest to dobre założenie site
zostanie załadowany w czasie działania., Jeśli nie chcemy importować dodatkowych modułów, możemy zrobić to, co exit()
, quit()
I sys.exit()
robią za kulisami i raise SystemExit
wyjście z komunikatami o błędach
co jeśli otrzymamy złe dane od użytkownika?, Spójrzmy wstecz na nasz skrypt input.py
I dodajmy możliwość obsługi błędnych danych wejściowych od użytkownika (CTRL+D
aby przekazać znak EOF)
try
instrukcja mówi pythonowi, aby wypróbował kod wewnątrz instrukcji i przekazał wszelkie wyjątki do instrukcji except
przed zakończeniem.
wyjście bez błędu
Co zrobić, jeśli użytkownik przekaże programowi błąd, ale nie chcesz, aby Twój kod wydrukował błąd lub wykonał jakąś obsługę błędów, aby zminimalizować wpływ użytkownika?,
możemy dodać finally
polecenie, które pozwala nam wykonać kod po wykonaniu naszej obsługi błędów w catch
zauważ, że użytkownik nigdy nie pozna EOFError
wystąpił, może być użyty do przekazania wartości domyślnych w przypadku słabych danych wejściowych lub argumentów.,
Zakończ i zwolnij swoje zasoby
Ogólnie Rzecz Biorąc, Python zwalnia wszystkie zasoby, które wywołałeś w swoim programie automatycznie po jego zakończeniu, ale dla niektórych procesów dobrą praktyką jest umieszczanie niektórych ograniczonych zasobów w blokuwith
.
często można to zobaczyć w wywołaniachopen()
, gdzie brak poprawnego wydania pliku może spowodować problemy z odczytaniem lub zapisem do pliku później.
blokwith
automatycznie zwalnia wszystkie zasoby wymagane w nim., Jeśli chcemy bardziej jawnie upewnić się, że plik został zamknięty, możemy użyć polecenia atexit.register()
aby wywołać close()
$ nano openfile.pyimport atexitfile=open("testfile.txt","w")file.write("let"s write some text!\n")atexit.register(file.close)
Jeśli zasoby są wywoływane bez użycia with
block, upewnij się, że aby jawnie zwolnić je poleceniem atexit
.
kończy działanie po pewnym czasie
Jeśli obawiamy się, że nasz program nigdy nie zakończy się normalnie, możemy użyć modułu Pythonamultiprocessing
, aby upewnić się, że nasz program zakończy działanie.,
zauważ, jak proces nie został ukończony, gdy funkcja została poinformowana, aby czekać na 7 sekund, ale zakończone i wydrukowane, co miało być, gdy powiedziano, aby czekać 0 sekund!
wyjście za pomocą instrukcji return
Jeśli mamy sekcję kodu, której chcemy użyć do zakończenia całego programu, zamiast pozwolićbreak
kontynuować kod poza pętlą, możemy użyćreturn sys.exit()
aby całkowicie zakończyć kod.,
wyjście w środku funkcji
Jeśli nie chcemy używać instrukcji return, nadal możemy wywołać sys.exit()
aby zamknąć nasz program i dostarczyć return
w innej gałęzi. Użyjmy naszego kodu z break.py jeszcze raz.
kończy działanie po spełnieniu warunków
Jeśli mamy pętlę w naszym kodzie Pythona i chcemy mieć pewność, że kod może zakończyć się, jeśli napotka problem, możemy użyć flagi, którą może sprawdzić, aby zakończyć program.,
Exit on keypress
Jeśli chcemy przytrzymać nasz program w konsoli, dopóki nie naciśniemy klawisza, możemy użyć niezwiązanego input()
aby go zamknąć.
$ nano holdopen.pyinput("Press enter to continue")$ python3 holdopen.pyPress enter to continue$
możemy również przekazaćCTRL+C
do konsoli, aby nadać Pythonowi znakKeyboardInterrupt
. Możemy nawet obsłużyć wyjątek KeyboardInterrupt
, tak jak wcześniej obsługiwaliśmy wyjątki.,
wyjście z programu wielowątkowego
wyjście z programu wielowątkowego jest nieco bardziej zaangażowane, ponieważ proste sys.exit()
jest wywoływane z wątku, który zakończy tylko bieżący wątek., „Brudny” sposób, aby to zrobić, to użyć os._exit()
jak widać, program nie wydrukował reszty programu przed jego zakończeniem, dlatego os._exit()
jest zwykle zarezerwowany dla ostatniej deski ratunku i wywołanie albo Thread.join()
z głównego wątku jest preferowaną metodą zakończenia programu wielowątkowego.,
koniec bez wyjścia sys
Sys.exit()
jest tylko jednym z kilku sposobów wyjścia z naszych programów Pythona, co sys.exit()
robi to raise SystemExit
, więc możemy równie łatwo użyć dowolnego wbudowanego wyjątku w Pythonie lub stworzyć jeden z naszych!
możemy również użyć os._exit()
aby powiedzieć systemowi hosta, aby zabił proces Pythona, chociaż to nie robi atexit
cleanup.,
wyjście z wyjątku
Jeśli chcemy wyjść z jakiegokolwiek wyjątku bez żadnej obsługi, możemy użyć naszego bloku try-except
do wykonania os._exit()
.
Wyjdź i uruchom ponownie
na koniec zbadamy, co robimy, aby wyjść z Pythona i ponownie uruchomić program, co jest przydatne w wielu przypadkach.
mam nadzieję, że tutorial okaże się przydatny. Wracaj.
Dziękuję.,
założyciel LikeGeeks. Pracuję jako administrator systemu Linux od 2010 roku. Jestem odpowiedzialny za utrzymywanie, zabezpieczanie i rozwiązywanie problemów z serwerami Linux dla wielu klientów na całym świecie. Uwielbiam pisać skrypty powłoki i Pythona, aby zautomatyzować moją pracę.