Забороніть повідомлення "<застосування> несподівано киньте" на підписі


18

Я вбиваю процеси Python за допомогою SIGQUIT, натискаючи Ctrl\іноді (як правило, мої власні, які погано себе ведуть). Чи можу я запобігти появі повідомлення "Python несподівано"? Я знаю, що я можу просто вдаритись на втечу, тому це не так вже й погано.

"Пітон несподівано кинув."  діалог


1
Чому замість цього ви не використовуєте control-C? SIGTERM не викликає повідомлення.
ughoavgfhw

@ughoavgfhw Я працюю над REPL, який іноді переводить термінал у сирому режимі, тому моя програма замість цього отримує ctrl-c як натискання клавіші. Також іноді у мене виникають проблеми з нитками, такі, що потоки, які повинні мати вимирати, не мають, а в Python ctrl-c, здається, лише вбиває основну нитку. (Я знаю, що мені слід використовувати t.daemon = Trueце, і я здебільшого є) З різних причин іноді мені потрібно використовувати ctrl- \.
Томас

Якщо це ваш код, то питання розробки ваш код повинен мати справу зі сигналами
user151019

@ Марк погодився - це була проблема, поки я ще не мав такої поведінки, яка працювала в певних крайніх випадках.
Томас

Відповіді:


18

Якщо ви ніколи не хочете переглядати діалогові вікна звітів про аварійне завершення роботи, бажано відключити їх:

defaults write com.apple.CrashReporter DialogType none

Вийдіть та поверніться, щоб застосувати зміни.


2
Вихід у моєму випадку не потрібен.
Cory Klein

6
Чи є спосіб зробити defaults write com.apple.CrashReporter DialogType noneвибірково лише для одного конкретного додатка?
SexyBeast

Для мене така поведінка не змінювалася (після введення команди) до виходу з системи та входу в систему.
r_alex_hall

12

Ви також можете зробити це повідомлення замість цього:

defaults write com.apple.CrashReporter UseUNC 1

2
Як ця. У macOS Sierra банер сповіщень ковзає в правому верхньому куті екрана і зникне самостійно, але якщо натиснути на нього, ви отримаєте оригінальне повне вікно демпінгу. Так що це ідеально. Набагато менш нав'язливий, але залишає варіанти відкритими.
clearlight

3

Поведінка за замовчуванням при отриманні SIGQUIT - це скидання ядра та вихід; репортаж про збій спрацьовує як частина цього процесу.

Починаючи з 10.5 (?), Просто встановлення обробника сигналу для SIGQUIT повинно бути достатнім, щоб уникнути аварійного звітування; ви, ймовірно, захочете, щоб обробник також викликав вихід.

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()

Вищевказаний код був протестований на 10.8.5 проти /usr/bin/pythonякого є 2.7.2.


1
Чи є спосіб зробити defaults write com.apple.CrashReporter DialogType noneвибірково лише для одного конкретного додатка?
SexyBeast
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.