py-patches / capture-bytes

# HG changeset patch
# Parent adc36f84f7808d61558cf399c3b205f2adf18417
use the replace handler for stray bytes on stdout/err capture

diff --git a/py/_io/ b/py/_io/
--- a/py/_io/
+++ b/py/_io/
@@ -12,7 +12,7 @@ if sys.version_info < (3,0):
     class TextIO(StringIO):
         def write(self, data):
             if not isinstance(data, unicode):
-                data = unicode(data, getattr(self, '_encoding', 'UTF-8'))
+                data = unicode(data, getattr(self, '_encoding', 'UTF-8'), 'replace')
             StringIO.write(self, data)
     TextIO = StringIO
@@ -259,8 +259,9 @@ class StdCaptureFD(Capture):
                 res =
                 enc = getattr(f, 'encoding', None)
+                print enc
                 if enc:
-                    res = py.builtin._totext(res, enc)
+                    res = py.builtin._totext(res, enc, 'replace')
diff --git a/testing/io_/ b/testing/io_/
--- a/testing/io_/
+++ b/testing/io_/
@@ -219,6 +219,12 @@ class TestStdCapture:
         out, err = cap.readouterr()
         assert out == py.builtin._totext("hx\xc4\x85\xc4\x87\n", "utf8")
+    def test_capturing_readouterr_decode_error_handling(self):
+        cap = self.getcapture()
+        # triggered a internal error in pytest
+        print('\xa6')
+        out, err = cap.readouterr()
     def test_capturing_mixed(self):
         cap = self.getcapture(mixed=True)
         sys.stdout.write("hello ")
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.