Python: Warum ruft 'sys.exit (msg)' von einem Thread nicht 'msg' zu stderr?

8

Heute bin ich gegen die Tatsache gelaufen, dass sys.exit() , aufgerufen von einem Kind-Thread, den Hauptprozess nicht beendet. Ich wusste das vorher nicht, und das ist okay, aber ich brauchte lange Zeit, um dies zu erkennen. Es hätte viel Zeit eingespart , wenn sys.exit(msg) msg auf stderr gedruckt hätte. Aber es hat nicht.

Es stellte sich heraus, dass es in meiner Anwendung kein richtiger Fehler war; es nannte sys.exit(msg) mit einem bedeutungsvollen Fehler auf eine volitionale Weise - aber ich konnte das einfach nicht sehen.

In den Dokumenten für sys.exit() steht : "[...] ein anderes Objekt wird in sys.stderr gedruckt und ergibt einen Exit-Code von 1"

Dies ist nicht wahr für einen Aufruf von einem untergeordneten Thread, wobei sich sys.exit() offensichtlich wie thread.exit() : "Heben Sie die SystemExit-Ausnahme auf. Wenn sie nicht abgefangen wird, beendet der Thread stillschweigend "

Ich denke, wenn ein Programmierer möchte, dass sys.exit(msg) eine Fehlermeldung ausgibt, sollte diese einfach gedruckt werden - unabhängig davon, wo sie aufgerufen wird. Warum nicht? Ich sehe derzeit keinen Grund. Zumindest sollte es in den Dokumenten für sys.exit() einen Hinweis geben, dass die Nachricht nicht aus Threads gedruckt wird.

Was denkst du? Warum werden Fehlermeldungen von Threads verborgen? Macht das Sinn?

Mit freundlichen Grüßen

Jan-Philip Gehrcke

    
Jan-Philip Gehrcke 30.07.2009, 20:29
quelle

2 Antworten

6

Ich stimme zu, dass die Python-Dokumente in Bezug auf sys.exit und SystemExit inkorrekt oder vielleicht genauer unvollständig sind, wenn sie von anderen Threads als dem Haupt-Thread aufgerufen / ausgelöst werden; Bitte öffnen Sie ein DOC-Problem im Python-Online-Tracker, damit dies in einer zukünftigen Iteration der Dokumente behoben werden kann (wahrscheinlich in naher Zukunft) - doc-Fixes sind einfacher und glatter als Code-Fixes; -).

Das Mittel ist natürlich ziemlich einfach - wickle einfach jede Funktion, die du als Ziel eines threading.Thread verwendest, mit einem Dekorator ein, der ein try / except SystemExit, e: darum herum ausführt, und führt das "Schreiben" aus stderr "zusätzliche Funktionalität, die Sie benötigen (oder vielleicht besser einen logging.error-Aufruf stattdessen), bevor Sie beenden. Aber mit dem doc-Problem, auf das Sie richtig hinweisen, ist es schwierig, darüber nachzudenken, solange und nicht bis einer das Problem gelöst hat und in der Tat einige Zeit im Debuggen verbringen musste, um es festzuhalten, wie Sie es mussten tun (im kollektiven Namen der Core-Python-Entwickler - Entschuldigung!).

    
Alex Martelli 30.07.2009, 21:03
quelle
0

Nicht alle Threads in Python sind gleich. Wenn sys.exit von einem Thread aufgerufen wird, wird das System nicht tatsächlich beendet. Daher ist das Aufrufen von sys.exit () von einem untergeordneten Thread unsinnig, daher ist es sinnvoll, dass es sich nicht wie erwartet verhält.

Diese Seite behandelt mehr über Threading-Objekte und die Unterschiede zwischen Threads und dem speziellen "Main" -Thread.

    
Christopher 30.07.2009 20:38
quelle

Tags und Links