Frage

Heute lief ich gegen die Tatsache, dass sys.exit() von einem Kind-Thread aufgerufen nicht den Hauptprozess töten. Ich wusste das nicht vor, und das ist in Ordnung, aber ich brauchte diese lange Zeit zu realisieren. Es wäre gerettet sehr viel Zeit , wenn sys.exit(msg) msg gedruckt hätte stderr. Aber es kam nicht.

Es stellte sich heraus, dass es kein echter Fehler in meiner Anwendung war; es genannt sys.exit(msg) mit einem bedeutungsvollen Fehler in einem willentlichen Weg - aber ich konnte einfach nicht sehen

.

In der Dokumentation für sys.exit() wird angegeben : "[...] ein anderes Objekt gedruckt sys.stderr und führt zu einem Exit-Code 1"

Dies ist nicht wahr für einen Anruf von einem kind Thread, wo sys.exit() offensichtlich wie thread.exit() : "Heben Sie die Systemexit Ausnahme. Wenn er nicht gefangen, das bewirkt, dass der Faden verlassen leise "

Ich denke, wenn ein Programmierer will sys.exit(msg) eine Fehlermeldung zu drucken, dann sollte dies nur gedruckt werden - unabhängig vom Ort, von wo sie genannt wird. Warum nicht? Ich derzeit sehe keinen Grund. Zumindest sollte es ein Hinweis in der Dokumentation für sys.exit() sein, dass die Nachricht nicht von Fäden gedruckt wird.

Was denken Sie? Warum werden Fehlermeldungen von Fäden verborgen? Ist dies sinnvoll?

Mit freundlichen Grüßen,

Jan-Philip Gehrcke

War es hilfreich?

Lösung

Ich bin damit einverstanden, dass die Python-Dokumentation falsch ist, oder vielleicht genauer unvollständig, in Bezug auf sys.exit und Systemexit, wenn sie von Fäden andere als das wichtigstes genannt / angehoben; Bitte geben Sie Ihren doc Ausgabe auf dem Online-Tracker Python öffnen, so kann dies in einer zukünftigen Wiederholung der docs angesprochen werden (wahrscheinlich eine in naher Zukunft ein - doc-Fixes sind leichter und glatter als Code-Fixes; -).

Das Mittel ist recht einfach, natürlich - nur jede Funktion wickeln Sie mit einem Dekorateur als Ziel eines threading.Thread verwenden, das eine try tut / except SystemExit, e: um ihn herum, und führt die „schreiben, um stderr“ zusätzliche Funktionen Sie erfordern (oder, vielleicht besser, verwendet einen logging.error Anruf statt), bevor sie beendet. Aber mit dem doc Problem, dass Sie richtig darauf hin, es ist schwer zu tun, zu denken, dass, solange man mit dem Problem und in der Tat erfüllt hatte einige Zeit bei der Fehlersuche ausgeben, um es festzunageln, wie Sie gehabt haben tun (auf dem kollektiven Namen des Kern python-Entwicklers - sorry).

Andere Tipps

Nicht alle Fäden in Python sind gleich. Der Aufruf sys.exit aus einem Thread, verlassen Sie nicht wirklich das System. So sys.exit Aufruf () von einem untergeordneten Thread ist unsinnig, so macht es Sinn, dass es nicht verhält sich wie erwartet.

Die Seite rel="nofollow Gespräche mehr über Objekte, und die Unterschiede zwischen den Fäden Threading und der Sonder "main" thread.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top