Skip to content

Commit 36d1d8c

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

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

_pytest/capture.py

Lines changed: 17 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,7 +249,10 @@ 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)
@@ -371,9 +375,13 @@ def start(self):
371375
self.syscapture.start()
372376

373377
def snap(self):
374-
f = self.tmpfile
375-
f.seek(0)
376-
res = f.read()
378+
try:
379+
f = self.tmpfile
380+
f.seek(0)
381+
res = f.read()
382+
except OSError:
383+
self.tempfile = open(os.devnull, "r")
384+
res = ''
377385
if res:
378386
enc = getattr(f, "encoding", None)
379387
if enc and isinstance(res, bytes):
@@ -398,7 +406,10 @@ def suspend(self):
398406

399407
def resume(self):
400408
self.syscapture.resume()
401-
os.dup2(self.tmpfile_fd, self.targetfd)
409+
try:
410+
os.dup2(self.tmpfile_fd, self.targetfd)
411+
except OSError:
412+
self.targetfd = open(os.devnull, "r").fileno()
402413

403414
def writeorg(self, data):
404415
""" write to original file descriptor. """

0 commit comments

Comments
 (0)