From 4b00307425bb3219f269a13ba5a9526903d21ce8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Tue, 16 Mar 2010 13:19:21 +0000 Subject: [PATCH] Issue #6716/2: Backslash-replace error output in compilall. --- Lib/compileall.py | 5 ++++- Lib/test/test_compileall.py | 26 +++++++++++++++++++++++++- Misc/NEWS | 2 ++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Lib/compileall.py b/Lib/compileall.py index c3bf25a5db..eb5e24b318 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -104,7 +104,10 @@ def compile_file(fullname, ddir=None, force=0, rx=None, quiet=0): print('*** Error compiling', fullname, '...') else: print('*** ', end='') - print(err.msg) + # escape non-printable characters in msg + msg = err.msg.encode(sys.stdout.encoding, errors='backslashreplace') + msg = msg.decode(sys.stdout.encoding) + print(msg) success = 0 except (SyntaxError, UnicodeError, IOError) as e: if quiet: diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index 65622f712a..4b6feba24e 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -1,3 +1,4 @@ +import sys import compileall import imp import os @@ -7,6 +8,7 @@ import struct import tempfile from test import support import unittest +import io class CompileallTests(unittest.TestCase): @@ -72,8 +74,30 @@ class CompileallTests(unittest.TestCase): os.unlink(self.bc_path) os.unlink(self.bc_path2) +class EncodingTest(unittest.TestCase): + 'Issue 6716: compileall should escape source code when printing errors to stdout.' + + def setUp(self): + self.directory = tempfile.mkdtemp() + self.source_path = os.path.join(self.directory, '_test.py') + with open(self.source_path, 'w', encoding='utf-8') as file: + file.write('# -*- coding: utf-8 -*-\n') + file.write('print u"\u20ac"\n') + + def tearDown(self): + shutil.rmtree(self.directory) + + def test_error(self): + try: + orig_stdout = sys.stdout + sys.stdout = io.TextIOWrapper(io.BytesIO(),encoding='ascii') + compileall.compile_dir(self.directory) + finally: + sys.stdout = orig_stdout + def test_main(): - support.run_unittest(CompileallTests) + support.run_unittest(CompileallTests, + EncodingTest) if __name__ == "__main__": diff --git a/Misc/NEWS b/Misc/NEWS index 93a991be11..018adf07b0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -283,6 +283,8 @@ C-API Library ------- +- Issue #6716/2: Backslash-replace error output in compilall. + - Issue #4961: Inconsistent/wrong result of askyesno function in tkMessageBox with Tcl/Tk-8.5. -- 2.50.1