diff --git a/AUTHORS b/AUTHORS index 7206125c8..3a2c3b39d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -31,6 +31,7 @@ Eduardo Schettino Elizaveta Shashkova Eric Hunsberger Eric Siegerman +Erik M. Bray Florian Bruhin Floris Bruynooghe Gabriel Reis diff --git a/CHANGELOG b/CHANGELOG index b0d66d976..ac45c1426 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,9 @@ this was a regression failing plugins combinations like pytest-pep8 + pytest-flakes +- Workaround for exception that occurs in pyreadline when using + ``--pdb`` with standard I/O capture enabled. + 2.8.5 ----- diff --git a/_pytest/capture.py b/_pytest/capture.py index 478d475f1..0d839d7d3 100644 --- a/_pytest/capture.py +++ b/_pytest/capture.py @@ -308,14 +308,7 @@ class FDCapture: """ Capture IO to/from a given os-level filedescriptor. """ def __init__(self, targetfd, tmpfile=None): - # ensure readline is imported so that it attaches to the correct - # stdio handles on Windows - if targetfd in (0, 1, 2): - try: - import readline - except ImportError: - pass - + readline_workaround() self.targetfd = targetfd try: self.targetfd_save = os.dup(self.targetfd) @@ -450,3 +443,28 @@ class DontReadFromInput: def close(self): pass + + +def readline_workaround(): + """ + Ensure readline is imported so that it attaches to the correct stdio + handles on Windows. + + Pdb uses readline support where available--when not running from the Python + prompt, the readline module is not imported until running the pdb REPL. If + running py.test with the --pdb option this means the readline module is not + imported until after I/O capture has been started. + + This is a problem for pyreadline, which is often used to implement readline + support on Windows, as it does not attach to the correct handles for stdout + and/or stdin if they have been redirected by the FDCapture mechanism. This + workaround ensures that readline is imported before I/O capture is setup so + that it can attach to the actual stdin/out for the console. + + See https://github.com/pytest-dev/pytest/pull/1281 + """ + + try: + import readline # noqa + except ImportError: + pass