DontReadFromInput only throws IOError when read is being used.
pyrepl for example would raise termios.error when it tries to use tcgetattr - it does not read directly:
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR> File "/home/daniel/Vcs/pyrepl-git/pyrepl/reader.py", line 482, in prepare
INTERNALERROR> self.console.prepare()
INTERNALERROR> File "/home/daniel/Vcs/pyrepl-git/pyrepl/unix_console.py", line 357, in prepare
INTERNALERROR> self.__svtermstate = tcgetattr(self.input_fd)
INTERNALERROR> File "/home/daniel/Vcs/pyrepl-git/pyrepl/fancy_termios.py", line 34, in tcgetattr
INTERNALERROR> return TermState(termios.tcgetattr(fd))
INTERNALERROR> termios.error: (25, 'Inappropriate ioctl for device')
I've tried changing this to EOFError, which I found more appropriate (https://github.com/blueyed/pyrepl/pull/7), but then noticed that this causes pytest to consider this to be a quitting-the-debugger event (same as Ctrl-d).
This "silent" exit was confusing when I've noticed this while stepping to pytest itself, where it would run code with set_trace and apparently capturing output around it (another/a different issue).
I think we should maybe not use Exit for do_EOF (via set_quit), but only with do_quit as a first step. This would also give the benefit of having Ctrl-d work differently than q (displaying a traceback, and test summaries).
|
class DontReadFromInput(six.Iterator): |
|
"""Temporary stub class. Ideally when stdin is accessed, the |
|
capturing should be turned off, with possibly all data captured |
|
so far sent to the screen. This should be configurable, though, |
|
because in automated test runs it is better to crash than |
|
hang indefinitely. |
|
""" |
|
|
|
encoding = None |
|
|
|
def read(self, *args): |
|
raise IOError("reading from stdin while output is captured") |
|
|
|
readline = read |
|
readlines = read |
|
__next__ = read |
|
|
|
def __iter__(self): |
|
return self |
|
|
|
def fileno(self): |
|
raise UnsupportedOperation("redirected stdin is pseudofile, has no fileno()") |
|
|
|
def isatty(self): |
|
return False |
|
|
|
def close(self): |
|
pass |
|
|
|
@property |
|
def buffer(self): |
|
if sys.version_info >= (3, 0): |
|
return self |
|
else: |
|
raise AttributeError("redirected stdin has no attribute buffer") |
DontReadFromInputonly throwsIOErrorwhenreadis being used.pyreplfor example would raisetermios.errorwhen it tries to usetcgetattr- it does notreaddirectly:I've tried changing this to
EOFError, which I found more appropriate (https://github.com/blueyed/pyrepl/pull/7), but then noticed that this causes pytest to consider this to be a quitting-the-debugger event (same asCtrl-d).This "silent" exit was confusing when I've noticed this while stepping to pytest itself, where it would run code with
set_traceand apparently capturing output around it (another/a different issue).I think we should maybe not use
Exitfordo_EOF(viaset_quit), but only withdo_quitas a first step. This would also give the benefit of havingCtrl-dwork differently thanq(displaying a traceback, and test summaries).pytest/src/_pytest/capture.py
Lines 704 to 738 in 2051e30