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
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 :
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.
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
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.
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.
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.
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 .
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".
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.
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.
quelle
Aus der Dokumentation für
sys.exit
: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 :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.quelle
grep
dieser Trend durch Beenden mit,1
wenn keine Linien übereinstimmen, und2
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:
quelle
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 :
quelle
errno
und errno.h ), sondern ein Exit - Status - Code von 77 (nachos
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.
quelle
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.
quelle
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.
quelle
Wenn Sie die Standard-POSIX-Exit-Codes portabel verwenden
exitstatus
möchten, lesen Sie das Paket auf PyPI.Installieren Sie das Paket:
Verwenden Sie in Ihrem Code:
quelle
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.
quelle
Ich bin mir nicht sicher, ob dies ein guter Rat ist.
Die erwähnte Dokumentation lautet:
Dann:
Wenn wir es mit der Dokumentation zu sys.exit () vergleichen , wird derselbe Mechanismus verwendet, der eine
SystemExit
Ausnahme auslöst .quelle
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".
quelle
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.quelle
SystemExit
scheint so oder so angehoben zu werden.os._exit
, die beiden scheinen zu erhöhenSystemExit
.sys.exit()
tut Abschaltung sauber, genau wieexit()
. Beide machen dasselbe : eineSystemExit
Ausnahme auslösen. Eigentlichexit()
für die interaktiven Sitzungen gemeint ist, nicht Skripte, so konzeptionellsys.exit()
ist die angezeigte ein. Sie könnten verwirrt sein mitos._exit()
, das ist derjenige, der abrupt endet.