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?
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?
Antworten:
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.
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.
grep
dieser Trend durch Beenden mit, 1
wenn keine Linien übereinstimmen, und 2
durch tatsächliche Fehler beendet wird. Vielen Dank, Stallman.
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
exitstatus
wünschen , die auf allen Betriebssystemen verfügbar sind, lesen Sie das PyPI-Paket.
Es gibt ein errno
Modul, 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)
errno
und errno.h ), sondern ein Exit - Status - Code von 77 (nach os
und sysexits.h ). Programme, die erstere ausgeben, sind nicht Standard ( de facto vel jure ) und spielen nicht gut mit anderen, die letztere zu Recht erwarten.
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.
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.
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.
Wenn Sie die Standard-POSIX-Exit-Codes portabel verwenden exitstatus
mö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)
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.
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 SystemExit
Ausnahme auslöst .
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.
SystemExit
scheint so oder so angehoben zu werden.
os._exit
, die beiden scheinen zu erhöhen SystemExit
.
sys.exit()
tut Abschaltung sauber, genau wie exit()
. Beide machen dasselbe : eine SystemExit
Ausnahme 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.