From d995bf5eda3cd8dae5c86206ee44f4ccd77d70bb Mon Sep 17 00:00:00 2001 From: Armin Rigo Date: Wed, 18 Nov 2015 12:28:44 +0100 Subject: Write one error message directly to stderr instead of sys.stderr. This lets us avoid taking the GIL, which might crash in case the Python interpreter is not initialized at all. --- testing/support.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'testing/support.py') diff --git a/testing/support.py b/testing/support.py index 17c56cd..17ee621 100644 --- a/testing/support.py +++ b/testing/support.py @@ -17,3 +17,40 @@ else: u = "" unicode = str long = int + + +class StdErrCapture(object): + """Capture writes to sys.stderr (not to the underlying file descriptor).""" + def __enter__(self): + import StringIO + self.old_stderr = sys.stderr + sys.stderr = f = StringIO.StringIO() + return f + def __exit__(self, *args): + sys.stderr = self.old_stderr + + +class FdWriteCapture(object): + """xxx limited to capture at most 512 bytes of output, according + to the Posix manual.""" + + def __init__(self, capture_fd=2): # stderr by default + self.capture_fd = capture_fd + + def __enter__(self): + import os + self.read_fd, self.write_fd = os.pipe() + self.copy_fd = os.dup(self.capture_fd) + os.dup2(self.write_fd, self.capture_fd) + return self + + def __exit__(self, *args): + import os + os.dup2(self.copy_fd, self.capture_fd) + os.close(self.copy_fd) + os.close(self.write_fd) + self._value = os.read(self.read_fd, 512) + os.close(self.read_fd) + + def getvalue(self): + return self._value -- cgit v1.2.1