Index: Lib/doctest.py =================================================================== --- Lib/doctest.py (revision 78484) +++ Lib/doctest.py (working copy) @@ -235,6 +235,19 @@ traceback.print_exception(exc_type, exc_val, exc_tb, file=excout) return excout.getvalue() +def _bulletproof_write(stdout): + """ + Implement `backsplashreplace` error handling on write when encoding + is not `utf-8`. + """ + encoding = stdout.encoding + if encoding is None or encoding.lower() == 'utf-8': + return stdout.write + def write(s): + s = str(s.encode(encoding, 'backslashreplace'), encoding) + stdout.write(s) + return write + # Override some StringIO methods. class _SpoofOut(StringIO): def getvalue(self): @@ -1354,7 +1367,7 @@ save_stdout = sys.stdout if out is None: - out = save_stdout.write + out = _bulletproof_write(save_stdout) sys.stdout = self._fakeout # Patch pdb.set_trace to restore sys.stdout during interactive Index: Lib/test/test_doctest.py =================================================================== --- Lib/test/test_doctest.py (revision 78484) +++ Lib/test/test_doctest.py (working copy) @@ -2288,6 +2288,25 @@ >>> doctest.testfile('test_doctest4.txt', encoding='utf-8') TestResults(failed=0, attempted=2) >>> doctest.master = None # Reset master. + + >>> doctest.testfile('test_doctest4.txt', encoding='utf-8', verbose=True) + Trying: + 'föö' + Expecting: + 'f\xf6\xf6' + ok + Trying: + 'bąr' + Expecting: + 'b\u0105r' + ok + 1 items passed all tests: + 2 tests in test_doctest4.txt + 2 tests in 1 items. + 2 passed and 0 failed. + Test passed. + TestResults(failed=0, attempted=2) + >>> doctest.master = None # Reset master. """ def test_testmod(): r""" @@ -2308,9 +2327,19 @@ def test_main(): # Check the doctest cases in doctest itself: support.run_doctest(doctest, verbosity=True) - # Check the doctest cases defined here: + from test import test_doctest - support.run_doctest(test_doctest, verbosity=True) + # Save the real sys.argv list. + save_argv = sys.argv + if '-v' in sys.argv: + # Remove '-v' before running tests + sys.argv = [arg for arg in save_argv if arg != '-v'] + try: + # Check the doctest cases defined here: + support.run_doctest(test_doctest, verbosity=True) + finally: + # Restore sys.argv + sys.argv = save_argv import trace, sys, re, io def test_coverage(coverdir):