diff --git a/IPython/terminal/debugger.py b/IPython/terminal/debugger.py index 66ffc19..db8ecac 100644 --- a/IPython/terminal/debugger.py +++ b/IPython/terminal/debugger.py @@ -1,10 +1,8 @@ import asyncio import signal import sys -import threading from IPython.core.debugger import Pdb - from IPython.core.completer import IPCompleter from .ptutils import IPythonPTCompleter from .shortcuts import create_ipython_shortcuts, suspend_to_bg, cursor_in_leading_ws @@ -18,6 +16,7 @@ from pygments.token import Token from prompt_toolkit.shortcuts.prompt import PromptSession from prompt_toolkit.enums import EditingMode from prompt_toolkit.formatted_text import PygmentsTokens +from concurrent.futures import ThreadPoolExecutor from prompt_toolkit import __version__ as ptk_version PTK3 = ptk_version.startswith('3.') @@ -30,6 +29,7 @@ class TerminalPdb(Pdb): Pdb.__init__(self, *args, **kwargs) self._ptcomp = None self.pt_init(pt_session_options) + self.thread_executor = ThreadPoolExecutor(1) def pt_init(self, pt_session_options=None): """Initialize the prompt session and the prompt loop @@ -102,7 +102,7 @@ class TerminalPdb(Pdb): if intro is not None: self.intro = intro if self.intro: - self.stdout.write(str(self.intro)+"\n") + print(self.intro, file=self.stdout) stop = None while not stop: if self.cmdqueue: @@ -112,24 +112,11 @@ class TerminalPdb(Pdb): self._ptcomp.ipy_completer.global_namespace = self.curframe.f_globals # Run the prompt in a different thread. - line = '' - keyboard_interrupt = False - - def in_thread(): - nonlocal line, keyboard_interrupt - try: - line = self.pt_app.prompt() - except EOFError: - line = 'EOF' - except KeyboardInterrupt: - keyboard_interrupt = True - - th = threading.Thread(target=in_thread) - th.start() - th.join() - - if keyboard_interrupt: - raise KeyboardInterrupt + try: + line = self.thread_executor.submit(self.pt_app.prompt).result() + except EOFError: + line = "EOF" + line = self.precmd(line) stop = self.onecmd(line) stop = self.postcmd(stop, line)