* Moved workaround to its own function, mostly for the sake of adding

a more descriptive docstring (the workaround itself is just to import
  readline earlier).  I removed the conditional on targetfd from the
  workaround since it doesn't really matter.

* Added # noqa marker.

* Added changelog entry, and self to authors.
This commit is contained in:
Erik M. Bray 2015-12-24 16:43:34 -05:00
parent 924a9667e1
commit 6e170a4a1c
3 changed files with 30 additions and 8 deletions

View File

@ -31,6 +31,7 @@ Eduardo Schettino
Elizaveta Shashkova
Eric Hunsberger
Eric Siegerman
Erik M. Bray
Florian Bruhin
Floris Bruynooghe
Gabriel Reis

View File

@ -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
-----

View File

@ -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