diff --git a/packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/display.py b/packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/display.py index bac096b8..790c0fbc 100644 --- a/packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/display.py +++ b/packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/display.py @@ -58,6 +58,7 @@ class LiteDisplayHook(DisplayHook): def __init__(self, *args, **kwargs): super(LiteDisplayHook, self).__init__(*args, **kwargs) self.publish_execution_result = None + self.publish_execution_error = None def start_displayhook(self): self.data = {} diff --git a/packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/interpreter.py b/packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/interpreter.py index aa844c36..426c371e 100644 --- a/packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/interpreter.py +++ b/packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/interpreter.py @@ -56,6 +56,12 @@ def enable_gui(self, gui=None): pass def _showtraceback(self, etype, evalue, stb): + sys.stdout.flush() + sys.stderr.flush() + dh = self.displayhook + if dh.publish_execution_error: + dh.publish_execution_error(str(etype), str(evalue), stb) + self._last_traceback = { "ename": str(etype), "evalue": str(evalue), diff --git a/packages/pyodide-kernel/src/worker.ts b/packages/pyodide-kernel/src/worker.ts index 675d6bcb..7e75b0e3 100644 --- a/packages/pyodide-kernel/src/worker.ts +++ b/packages/pyodide-kernel/src/worker.ts @@ -289,7 +289,7 @@ ${e.stack}`; const bundle = { ename: ename, evalue: evalue, - traceback: traceback, + traceback: this.formatResult(traceback), }; this._sendWorkerMessage({ @@ -363,6 +363,7 @@ ${e.stack}`; this._interpreter.display_pub.update_display_data_callback = updateDisplayDataCallback; this._interpreter.displayhook.publish_execution_result = publishExecutionResult; + this._interpreter.displayhook.publish_execution_error = publishExecutionError; this._interpreter.input = this.input.bind(this); this._interpreter.getpass = this.getpass.bind(this);