1- import contextlib
21import faulthandler
32import functools
43import gc
54import importlib
65import io
76import os
87import sys
9- import tempfile
108import time
119import traceback
1210import unittest
@@ -175,63 +173,6 @@ def get_abs_module(ns: Namespace, test_name: str) -> str:
175173 return 'test.' + test_name
176174
177175
178- @contextlib .contextmanager
179- def override_fd (fd , fd2 ):
180- fd2_copy = os .dup (fd2 )
181- try :
182- os .dup2 (fd , fd2 )
183- yield
184- finally :
185- os .dup2 (fd2_copy , fd2 )
186- os .close (fd2_copy )
187-
188-
189- def get_stream_fd (stream ):
190- if stream is None :
191- return None
192- try :
193- return stream .fileno ()
194- except io .UnsupportedOperation :
195- return None
196-
197-
198- @contextlib .contextmanager
199- def capture_std_streams ():
200- """
201- Redirect all standard streams to a temporary file:
202-
203- * stdout and stderr file descriptors (fd 1 and fd 2)
204- * sys.stdout, sys.__stdout__
205- * sys.stderr, sys.__stderr__
206- """
207- try :
208- stderr_fd = sys .stderr .fileno ()
209- except io .UnsupportedOperation :
210- stderr_fd = None
211-
212- # Use a temporary file to support fileno() operation
213- tmp_file = tempfile .TemporaryFile (mode = 'w+' ,
214- # line buffering
215- buffering = 1 ,
216- encoding = sys .stderr .encoding ,
217- errors = sys .stderr .errors )
218- with contextlib .ExitStack () as stack :
219- stack .enter_context (tmp_file )
220-
221- # Override stdout and stderr file descriptors
222- tmp_fd = tmp_file .fileno ()
223- for stream in (sys .stdout , sys .stderr ):
224- fd = get_stream_fd (stream )
225- if fd is not None :
226- stack .enter_context (override_fd (tmp_fd , fd ))
227-
228- # Override sys attributes
229- for name in ('stdout' , 'stderr' , '__stdout__' , '__stderr__' ):
230- stack .enter_context (support .swap_attr (sys , name , tmp_file ))
231-
232- yield tmp_file
233-
234-
235176def _runtest (ns : Namespace , test_name : str ) -> TestResult :
236177 # Handle faulthandler timeout, capture stdout+stderr, XML serialization
237178 # and measure time.
@@ -252,13 +193,20 @@ def _runtest(ns: Namespace, test_name: str) -> TestResult:
252193 if output_on_failure :
253194 support .verbose = True
254195
196+ stream = io .StringIO ()
197+ orig_stdout = sys .stdout
198+ orig_stderr = sys .stderr
255199 output = None
256- with capture_std_streams () as stream :
200+ try :
201+ sys .stdout = stream
202+ sys .stderr = stream
257203 result = _runtest_inner (ns , test_name ,
258204 display_failure = False )
259205 if not isinstance (result , Passed ):
260- stream .seek (0 )
261- output = stream .read ()
206+ output = stream .getvalue ()
207+ finally :
208+ sys .stdout = orig_stdout
209+ sys .stderr = orig_stderr
262210
263211 if output is not None :
264212 sys .stderr .write (output )
0 commit comments