Beenden Sie Codes in Python


207

Ich habe eine Nachricht erhalten script xyz.py returned exit code 0. Was bedeutet das?

Was bedeuten die Exit-Codes in Python? Wie viele sind es? Welche sind wichtig?


1
Wo sehen Sie diese Nachricht?
Jeremy Cantrell

1
@Jeremy Am Ende von PythonWin.
Sonnentag

Antworten:


223

Was Sie im Skript suchen, sind Aufrufe von sys.exit(). Das Argument für diese Methode wird als Exit-Code an die Umgebung zurückgegeben.

Es ist ziemlich wahrscheinlich, dass das Skript niemals die Exit-Methode aufruft und dass 0 der Standard-Exit-Code ist.


12
Ich bin mir überhaupt nicht sicher. Unter Unix / Linux lautet der Standard: Beenden Sie 0, falls alles in Ordnung war. Geben Sie einen Befehl ein und geben Sie dann $ ?: Echo aus. Wenn Sie 0 lesen, wird dieser ohne Fehler zurückgegeben. Die Idee ist, Standardtests zu haben. Wenn der Code xyz.py keinen Fehler festgestellt hat, sollte er 0 zurückgeben!
Bruno von Paris

1
Wenn Sie den Exit-Code ändern möchten, ziehen Sie es vor, mit dem eingebauten Exit sauber zu beenden, siehe diese Antwort
vidstige

101

Aus der Dokumentation fürsys.exit :

Das optionale Argument arg kann eine Ganzzahl sein, die den Exit-Status angibt (standardmäßig Null), oder ein anderer Objekttyp. Wenn es sich um eine Ganzzahl handelt, wird Null als "erfolgreiche Beendigung" betrachtet, und jeder Wert ungleich Null wird von Schalen und dergleichen als "abnormale Beendigung" angesehen. Die meisten Systeme erfordern einen Bereich zwischen 0 und 127 und führen ansonsten zu undefinierten Ergebnissen. Einige Systeme haben eine Konvention zum Zuweisen bestimmter Bedeutungen zu bestimmten Exit-Codes, aber diese sind im Allgemeinen unterentwickelt. Unix-Programme verwenden im Allgemeinen 2 für Befehlszeilensyntaxfehler und 1 für alle anderen Arten von Fehlern.

Ein Beispiel für die Verwendung von Exit-Codes sind Shell-Skripte. In bash können Sie die spezielle Variable $?auf den letzten Exit-Status überprüfen :

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

Persönlich versuche ich, die Exit-Codes zu verwenden, die ich in /usr/include/asm-generic/errno.h(auf einem Linux-System) finde , aber ich weiß nicht, ob dies das Richtige ist.


3
In einem anderen Beitrag habe ich diesen Link gefunden: tldp.org/LDP/abs/html/exitcodes.html Könnte nützlich sein. :)
Eigir

9
errno.h steht normalerweise für Exit-Codes für Funktionsaufrufe. Versuche, Programm-Exit-Codes zu standardisieren, haben dazu geführt, dass /usr/include/sysexits.h auf den meisten POSIX-Systemen vorhanden ist.
mpounsett

1
Es ist sehr gut zu wissen, dass "Unix-Programme im Allgemeinen 2 für Befehlszeilensyntaxfehler verwenden"!
Dantiston

2
@ Dantiston Concur. Die eingefleischte Gentoo-Verfechterin, aber ich wusste das nie ... bis zu diesem schicksalhaften Tag. ( Meine Schande endet jetzt. ) Beachten Sie auch, dass grepdieser Trend durch Beenden mit, 1wenn keine Linien übereinstimmen, und 2durch tatsächliche Fehler beendet wird. Vielen Dank, Stallman.
Cecil Curry

32

Für den Datensatz können Sie die hier definierten POSIX-Standard-Exit-Codes verwenden .

Beispiel:

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

3
Laut Dokumentation sind diese nur unter Unix-Betriebssystemen verfügbar, sodass sie nicht vollständig portierbar sind.
Phoenix

1
Wenn Sie tragbare POSIX-Codes exitstatuswünschen , die auf allen Betriebssystemen verfügbar sind, lesen Sie das PyPI-Paket.
Phoenix

1
Die Gesamtheit dieses Pakets ist 0 für Erfolg und 1 für Misserfolg.
Pavel Minaev

25

Es gibt ein errnoModul, das Standard-Exit-Codes definiert:

Zum Beispiel verweigerte Genehmigung ist Fehlercode 13 :

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)

36
Das ist falsch. Diese Fehler sind nicht als Prozess-Exit-Codes vorgesehen. Hierbei handelt es sich um Fehlercodes auf niedriger Ebene, die intern in Programmen verwendet werden sollen, insbesondere in Programmen, die in der Sprache C geschrieben sind. Verwenden Sie für Python nach Möglichkeit Ausnahmen.
SvdB

2
Du hast recht. Diese sind intern zu verwenden. Normalerweise lösen Sie jedoch keine Ausnahmen auf Endbenutzerebene aus. Sie verwenden sys.exit (x), wobei x eine beliebige Ganzzahl ist. Sie können jedoch diejenigen verwenden, die mit EX_ beginnen und im Modul 'os' definiert sind. Wie os.EX_OK oder os.EX_IOERR
Oli

2
Entschuldigung, aber ich stimme dies auch ab, weil es irreführend ist. Ausgangsstatuscodes und Fehlernummern sind nicht austauschbar / komplementär. Unter Verwendung des angegebenen Beispiel „Zugriff verweigert“ hat einen Fehlercode von 13 (nach errnound errno.h ), sondern ein Exit - Status - Code von 77 (nach osund sysexits.h ). Programme, die erstere ausgeben, sind nicht Standard ( de facto vel jure ) und spielen nicht gut mit anderen, die letztere zu Recht erwarten.
Mark G.

14

Exit-Codes von 0 bedeuten normalerweise "hier ist nichts falsch". Wenn der Programmierer des Skripts jedoch nicht der Konvention entspricht, müssen Sie möglicherweise die Quelle konsultieren, um zu sehen, was dies bedeutet. Normalerweise wird ein Wert ungleich Null als Fehlercode zurückgegeben.


6

Die Antwort lautet "Hängt davon ab, was der Exit-Code Null bedeutet".

In den meisten Fällen bedeutet dies jedoch "Alles ist in Ordnung".


Ich mag POSIX:

Also würde ich auf der Shell Folgendes eingeben:

python script.py && echo 'OK' || echo 'Not OK'

Wenn mein Python-Skript aufruft, gibt sys.exit(0)die Shell 'OK' zurück.

Wenn mein Python-Skript sys.exit(1)(oder eine Ganzzahl ungleich Null) aufruft , gibt die Shell "Nicht OK" zurück.

Es ist Ihre Aufgabe, sich mit der Shell vertraut zu machen und die Dokumentation (oder die Quelle) Ihres Skripts zu lesen, um zu sehen, was die Exit-Codes bedeuten.


Der Vollständigkeit halber wird "Nicht OK" gedruckt, wenn das Python-Skript einen Fehler ausgelöst hat ODER ein Syntaxfehler aufgetreten ist.
Shital Shah

5

Betriebssystembefehle haben Exit-Codes. Suchen Sie nach Linux-Exit-Codes , um Material dazu zu sehen. Die Shell verwendet die Exit-Codes, um zu entscheiden, ob das Programm funktioniert hat, Probleme hatte oder fehlgeschlagen ist. Es gibt einige Bemühungen, Standard-Exit-Codes (oder zumindest häufig verwendete) zu erstellen. Siehe diese Advanced Shell Script- Veröffentlichung.


5

Wenn Sie die Standard-POSIX-Exit-Codes portabel verwenden exitstatusmöchten, lesen Sie das Paket auf PyPI.

Installieren Sie das Paket:

$ pip install exitstatus

Verwenden Sie in Ihrem Code:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)

4

Die Exit-Codes haben nur die vom Skriptautor zugewiesene Bedeutung. Die Unix-Tradition besagt, dass Exit-Code 0 "Erfolg" bedeutet, alles andere ist Misserfolg. Die einzige Möglichkeit, um sicherzugehen, was die Exit-Codes für ein bestimmtes Skript bedeuten, besteht darin, das Skript selbst zu untersuchen.


4

Ich empfehle ein sauberes Herunterfahren mit dem eingebauten exit (0), anstatt sys.exit () zu verwenden.

Ich bin mir nicht sicher, ob dies ein guter Rat ist.

Die erwähnte Dokumentation lautet:

Das Site-Modul (das beim Start automatisch importiert wird, außer wenn die Befehlszeilenoption -S angegeben ist) fügt dem integrierten Namespace mehrere Konstanten hinzu. Sie sind nützlich für die interaktive Interpreter-Shell und sollten nicht in Programmen verwendet werden .

Dann:

Beenden (Code = Keine)

Objekte, die beim Drucken eine Nachricht wie "Verwenden Sie quit () oder Strg-D (dh EOF) zum Beenden" drucken und beim Aufruf SystemExit mit dem angegebenen Exit-Code auslösen.

Wenn wir es mit der Dokumentation zu sys.exit () vergleichen , wird derselbe Mechanismus verwendet, der eine SystemExitAusnahme auslöst .


2

Exit-Codes in vielen Programmiersprachen sind Sache der Programmierer. Sie müssen sich also Ihren Programmquellcode (oder Ihr Handbuch) ansehen. Null bedeutet normalerweise "alles ist gut gelaufen".


-2

Um die Ausführung von Ausnahmebehandlungsroutinen und anderen Dingen zu ermöglichen, empfehle ich ein sauberes Herunterfahren mit dem exit(0)eingebauten System, anstatt es zu verwenden, sys.exit()wodurch der Prozess abrupt beendet wird.


Was ist der Unterschied? Woher kommen diese Informationen? Meinen Sie die Ausführung der "at exit" -Handler oder worauf beziehen Sie sich genau? SystemExitscheint so oder so angehoben zu werden.
0xC0000022L

mm, ich habe es verwechselt mit os._exit, die beiden scheinen zu erhöhen SystemExit.
Vidstige

1
Falsch: sys.exit() tut Abschaltung sauber, genau wie exit(). Beide machen dasselbe : eine SystemExitAusnahme auslösen. Eigentlich exit()für die interaktiven Sitzungen gemeint ist, nicht Skripte, so konzeptionell sys.exit() ist die angezeigte ein. Sie könnten verwirrt sein mit os._exit(), das ist derjenige, der abrupt endet.
MestreLion
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.