Verhindern " unerwartet beenden"-Meldung auf sigquit

Ich beende Python-Prozesse mit SIGQUIT, indem ich Ctrl\manchmal drücke (normalerweise meine eigenen, die sich schlecht benehmen). Kann ich die Meldung „Python unerwartet beendet“ verhindern? Ich weiß, dass ich einfach auf Escape drücken kann, also ist es nicht so schlimm.

"Python wurde unerwartet beendet."  Dialog

Warum verwenden Sie nicht stattdessen Steuerung-C? SIGTERM verursacht die Meldung nicht.
@ughoavgfhw Ich arbeite an einer REPL, die das Terminal manchmal in den Raw-Modus versetzt, sodass mein Programm stattdessen Strg-c als Tastendruck empfängt. Manchmal habe ich auch Thread-Probleme, so dass Threads, die sterben sollten, nicht sterben, und in Python scheint Strg-C nur den Haupt-Thread zu beenden. (Ich weiß, dass ich t.daemon = Truediese verwenden sollte, und das tue ich größtenteils auch.) Aus verschiedenen Gründen muss ich manchmal Strg-\ verwenden.
Wenn es sich um Ihren Code handelt, muss Ihr Code mit Signalen umgehen
@Mark Einverstanden - dies war ein Problem, während dieses Verhalten in bestimmten Grenzfällen noch nicht funktionierte.

Antworten (3)

Wenn Sie die Dialogfelder für Absturzberichte nie sehen möchten, können Sie sie deaktivieren:

defaults write com.apple.CrashReporter DialogType none

Melden Sie sich ab und wieder an, um die Änderungen zu übernehmen.

Abmelden war in meinem Fall nicht erforderlich.
Gibt es eine Möglichkeit, dies defaults write com.apple.CrashReporter DialogType noneselektiv nur für eine bestimmte App zu tun?
Bei mir hat sich dieses Verhalten (nach Eingabe des Befehls) bis zum Abmelden und Anmelden nicht geändert.

Sie können die Nachricht stattdessen auch als Benachrichtigung anzeigen lassen:

defaults write com.apple.CrashReporter UseUNC 1
Wie dieser. Unter macOS Sierra gleitet ein Benachrichtigungsbanner oben rechts auf den Bildschirm und verschwindet von selbst, aber wenn Sie darauf klicken, erhalten Sie das ursprüngliche vollständige Crash-Dump-Fenster. Das ist also perfekt. Viel weniger aufdringlich, lässt aber Optionen offen.

Das Standardverhalten beim Empfang von SIGQUIT besteht darin, den Kern zu entleeren und zu beenden; Der Crash-Reporter wird als Teil dieses Prozesses ausgelöst.

Beginnend mit 10.5(?) sollte es ausreichen, einen Signal-Handler für SIGQUIT zu setzen, um den Crash-Reporter zu vermeiden; Wahrscheinlich möchten Sie, dass der Handler auch exit aufruft.

import signal, sys, os

def sigquit_handler(signum, frame):
    print 'SIGQUIT received; exiting'
    sys.exit(os.EX_SOFTWARE)

signal.signal(signal.SIGQUIT, sigquit_handler)

# Do your normal work instead of this
print 'Waiting for a signal...'
signal.pause()

Der obige Code wurde auf 10.8.5 gegen /usr/bin/python2.7.2 getestet.

Gibt es eine Möglichkeit, dies defaults write com.apple.CrashReporter DialogType noneselektiv nur für eine bestimmte App zu tun?