Skip to content

Commit 0dd3012

Browse files
committed
patch faulthandler defaults to underlying stderr
fault handler requires access to C-level FD, which doesn't make sense for forwarded stdout/stderr. Patch default to be underlying `__stderr__` instead of overridden `stderr`.
1 parent fd33374 commit 0dd3012

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

ipykernel/kernelapp.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,30 @@ def init_io(self):
303303
if self.displayhook_class:
304304
displayhook_factory = import_item(str(self.displayhook_class))
305305
sys.displayhook = displayhook_factory(self.session, self.iopub_socket)
306-
306+
307+
self.patch_io()
308+
309+
def patch_io(self):
310+
"""Patch important libraries that can't handle sys.stdout forwarding"""
311+
try:
312+
import faulthandler
313+
except ImportError:
314+
pass
315+
else:
316+
faulthandler_enable = faulthandler.enable
317+
faulthandler_register = faulthandler.register
318+
# Note: faulthandler signature may change. This is up-to-date as of Python 3.5
319+
320+
# change default file to __stderr__ from forwarded stderr
321+
def enable(file=sys.__stderr__, all_threads=True, **kwargs):
322+
return faulthandler_enable(file=file, all_threads=all_threads, **kwargs)
323+
324+
def register(signum, file=sys.__stderr__, all_threads=True, chain=False, **kwargs):
325+
return faulthandler_register(signum, file=file, all_threads=all_threads, chain=chain, **kwargs)
326+
327+
faulthandler.enable = enable
328+
faulthandler.register = register
329+
307330
def init_signal(self):
308331
signal.signal(signal.SIGINT, signal.SIG_IGN)
309332

0 commit comments

Comments
 (0)