Dostałem wiadomość z informacją script xyz.py returned exit code 0
. Co to znaczy?
Co oznaczają kody zakończenia w Pythonie? Ile tu tego jest? Które są ważne?
Dostałem wiadomość z informacją script xyz.py returned exit code 0
. Co to znaczy?
Co oznaczają kody zakończenia w Pythonie? Ile tu tego jest? Które są ważne?
Odpowiedzi:
To, czego szukasz w skrypcie, to wywołania sys.exit()
. Argument tej metody jest zwracany do środowiska jako kod wyjścia.
Jest całkiem prawdopodobne, że skrypt nigdy nie wywołuje metody wyjścia, a 0 jest domyślnym kodem wyjścia.
Opcjonalnym argumentem arg może być liczba całkowita podająca status wyjścia (domyślnie zero) lub inny typ obiektu. Jeśli jest to liczba całkowita, 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 i w przeciwnym razie dawałaby 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.
Jednym z przykładów użycia kodów wyjścia są skrypty powłoki. W bash możesz sprawdzić specjalną zmienną $?
dla ostatniego statusu wyjścia:
me@mini:~$ python -c ""; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(0)"; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(43)"; echo $?
43
Osobiście staram się używać kodów wyjścia, które znajduję /usr/include/asm-generic/errno.h
(w systemie Linux), ale nie wiem, czy jest to właściwe.
grep
przerywa ten trend, wychodząc z 1
kiedy żadne linie nie pasują i 2
na faktycznych błędach. Wielkie dzięki, Stallman.
Dla przypomnienia możesz użyć zdefiniowanych tutaj standardowych kodów wyjścia POSIX .
Przykład:
import sys, os
try:
config()
except:
sys.exit(os.EX_CONFIG)
try:
do_stuff()
except:
sys.exit(os.EX_SOFTWARE)
sys.exit(os.EX_OK) # code 0, all ok
exitstatus
pakiet PyPI.
Istnieje errno
moduł definiujący standardowe kody wyjścia:
Na przykład odmowa dostępu to kod błędu 13 :
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
errno
i errno.h ), ale kod statusu wyjścia 77 (zgodnie z os
i sysexits.h ). Programy emitujące te pierwsze są niestandardowe ( de facto vel jure ) i nie będą się dobrze bawić z innymi, które słusznie oczekują tego drugiego.
Kody wyjścia 0 zwykle oznaczają „nic złego tutaj”. Jednak jeśli programista skryptu nie przestrzegał konwencji, być może będziesz musiał skonsultować się ze źródłem, aby zobaczyć, co to znaczy. Zwykle niezerowa wartość jest zwracana jako kod błędu.
Odpowiedź brzmi „Zależy od tego, co oznacza kod zakończenia zero”
Jednak w większości przypadków oznacza to „Wszystko w porządku”
Lubię POSIX:
Tak więc w powłoce napisałbym:
python script.py && echo 'OK' || echo 'Not OK'
Jeśli mój skrypt python wywołuje sys.exit(0)
powłokę, zwraca „OK”
Jeśli mój skrypt w języku Python wywołuje sys.exit(1)
(lub dowolną liczbę całkowitą niezerową), powłoka zwraca „Nie OK”
Twoim zadaniem jest opanowanie powłoki i przeczytanie dokumentacji (lub źródła) skryptu, aby zobaczyć, co oznaczają kody zakończenia.
Komendy systemu operacyjnego mają kody wyjścia. Poszukaj kodów wyjścia Linux, aby zobaczyć na ten temat trochę materiału. Powłoka używa kodów wyjścia, aby zdecydować, czy program działał, miał problemy lub nie. Podejmowane są wysiłki w celu stworzenia standardowych (lub przynajmniej powszechnie używanych) kodów wyjścia. Zobacz ten post dotyczący zaawansowanego skryptu powłoki .
Polecam czyste zamknięcie z wbudowanym wyjściem (0) zamiast używania sys.exit ()
Nie jestem pewien, czy to dobra rada.
Już wspomniana dokumentacja brzmi:
Moduł serwisu (który jest importowany automatycznie podczas uruchamiania, z wyjątkiem sytuacji, gdy podano opcję wiersza polecenia -S) dodaje kilka stałych do wbudowanej przestrzeni nazw. Są one przydatne dla interaktywnej powłoki interpretera i nie powinny być używane w programach .
Następnie:
wyjście (kod = brak)
Obiekty, które po wydrukowaniu wydrukują komunikat „Użyj quit () lub Ctrl-D (tj. EOF), aby wyjść”, a po wywołaniu podnieś SystemExit z określonym kodem wyjścia.
Jeśli porównamy to z dokumentacją sys.exit () , używa tego samego mechanizmu, który zgłasza SystemExit
wyjątek.
Jeśli chcesz przenośnie używać standardowych kodów wyjścia POSIX , zobacz exitstatus
pakiet na PyPI.
Zainstaluj pakiet:
$ pip install exitstatus
Użyj w swoim kodzie:
import sys
from exitstatus import ExitStatus
sys.exit(ExitStatus.success)
Kody wyjścia mają jedynie znaczenie przypisane przez autora skryptu. Tradycja uniksowa głosi, że kod wyjścia 0 oznacza „sukces”, wszystko inne to porażka. Jedynym sposobem, aby upewnić się, co oznaczają kody zakończenia dla danego skryptu, jest sprawdzenie samego skryptu.
Aby umożliwić obsługę wyjątków i inne rzeczy, zalecam czyste zamknięcie z exit(0)
wbudowanym zamiast używania tego, sys.exit()
który przerywa proces nagle.
SystemExit
wydaje się być podniesiony w obu kierunkach.
os._exit
, oba wydają się podnosić SystemExit
.
sys.exit()
czy zamknięcie jest czyste, tak jak exit()
. Obaj robią to samo : podnoszą SystemExit
wyjątek. W rzeczywistości exit()
jest przeznaczony do interaktywnych sesji, a nie skryptów, więc koncepcyjnie sys.exit()
jest wskazany. Możesz się mylić z os._exit()
tym, który nagle się kończy.