Skip to content

Commit d0a032e

Browse files
committed
capture: recover from closed files
1 parent 5e0e038 commit d0a032e

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

_pytest/capture.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ def readouterr(self):
211211

212212
@contextlib.contextmanager
213213
def disabled(self):
214-
capmanager = self.request.config.pluginmanager.getplugin('capturemanager')
214+
capmanager = self.request.config.pluginmanager.getplugin(
215+
'capturemanager')
215216
capmanager.suspendcapture_item(self.request.node, "call", in_=True)
216217
try:
217218
yield
@@ -248,12 +249,20 @@ def __init__(self, buffer, encoding):
248249
def write(self, obj):
249250
if isinstance(obj, unicode):
250251
obj = obj.encode(self.encoding, "replace")
251-
self.buffer.write(obj)
252+
try:
253+
self.buffer.write(obj)
254+
except OSError:
255+
self.buffer = open(os.devnull, "wb+")
252256

253257
def writelines(self, linelist):
254258
data = ''.join(linelist)
255259
self.write(data)
256260

261+
def fileno(self):
262+
self.write('')
263+
264+
return self.buffer.fileno()
265+
257266
@property
258267
def name(self):
259268
"""Ensure that file.name is a string."""
@@ -371,9 +380,13 @@ def start(self):
371380
self.syscapture.start()
372381

373382
def snap(self):
374-
f = self.tmpfile
375-
f.seek(0)
376-
res = f.read()
383+
try:
384+
f = self.tmpfile
385+
f.seek(0)
386+
res = f.read()
387+
except OSError:
388+
self.tempfile = open(os.devnull, "r")
389+
res = ''
377390
if res:
378391
enc = getattr(f, "encoding", None)
379392
if enc and isinstance(res, bytes):
@@ -398,7 +411,10 @@ def suspend(self):
398411

399412
def resume(self):
400413
self.syscapture.resume()
401-
os.dup2(self.tmpfile_fd, self.targetfd)
414+
try:
415+
os.dup2(self.tmpfile_fd, self.targetfd)
416+
except OSError:
417+
self.targetfd = open(os.devnull, "r").fileno()
402418

403419
def writeorg(self, data):
404420
""" write to original file descriptor. """

0 commit comments

Comments
 (0)