--- contrib/python/pytest/py3/_pytest/debugging.py (index) +++ contrib/python/pytest/py3/_pytest/debugging.py (working tree) @@ -3,2 +3,3 @@ from __future__ import absolute_import import functools +import os import sys @@ -32,2 +33,38 @@ from _pytest import outcomes +def import_readline(): + try: + import readline + except ImportError: + sys.path.append('/usr/lib/python2.7/lib-dynload') + + try: + import readline + except ImportError as e: + print('can not import readline:', e) + + import subprocess + try: + subprocess.check_call('stty icrnl'.split()) + except OSError as e: + print('can not restore Enter, use Control+J:', e) + + +def tty(): + if os.isatty(1): + return + + fd = os.open('/dev/tty', os.O_RDWR) + os.dup2(fd, 0) + os.dup2(fd, 1) + os.dup2(fd, 2) + os.close(fd) + + old_sys_path = sys.path + sys.path = list(sys.path) + try: + import_readline() + finally: + sys.path = old_sys_path + + def _validate_usepdb_cls(value: str) -> Tuple[str, str]: @@ -280,2 +317,3 @@ class pytestPDB(object): """Invoke debugging via ``Pdb.set_trace``, dropping any IO capturing.""" + tty() frame = sys._getframe().f_back @@ -295,2 +333,3 @@ class PdbInvoke(object): sys.stdout.write(err) + tty() assert call.excinfo is not None